天天看點

記一次記憶體洩露調試(memory leak)-Driver Monkey

author:drivermonkey

mail:[email protected]

phone:13410905075

qq:196568501

硬體環境:am335x

軟體環境:linux 3.2 

現象:1)系統運作一晚上,配置硬體操作失效

           2)系統放置在那,沒有使用者輸入會自己當機

調試過程:

第一步:分析硬體配置失效原因,懷疑配置硬體代碼有問題

                最後發現 代碼 調用 system() 函數配置硬體沒有調用成功 傳回值 為 -1.

第二步: 繼續上一步 分析 system() 在什麼情況下會傳回 -1,

               檢視system 源代碼,得出結論 system() 函數會調用 fork() 函數 隻有fork() 函數失敗的時候會傳回 -1

第三步:進一步分析 fork() 調用失敗的原因, fork() 絕大部分情況在申請不到足夠記憶體時候會失敗

              到了這一步開始懷疑記憶體洩露引起的問題

第四步:驗證記憶體洩露問題

             1)運作應用程式,使程式負荷加到最大,用 free 檢視記憶體使用情況

                  發現記憶體在以 5kb/s 的速度減少(到這一步可以完全确認是記憶體洩露)

             2) 進一步驗證發現系統記憶體隻剩下 8kb 左右系統會非常卡。

                   最後核心會列印系統記憶體不足錯誤。

                   同時也有一定機率出現system() 函數調用失敗情況

第五步:調試代碼超出記憶體洩露代碼              

              1)懷疑是 malloc() 後沒有 free() 引起的 leak

                    驗證:在所有的malloc() 和 free()上包一層  并分别配置設定一個計數器,

                                發現計數器并沒有随時間推移而增加,排除是malloc 和free 的問題。

              2)懷疑系統中用的 c++ map  string  這些全局對象有問

                    分别列印這些對象的 size() 發現size 也沒有增加

                    到這一步調試有點陷入僵局,最後去了一趟茅廁,靈光一現是不是用的開源庫,用法不對引起的洩露問題

              3)驗證第二步的懷疑。整個系統跑的最多的就是xml庫

                    去掉xml 發現記憶體沒有再減少。

                    定位出xml庫的使用問題,重新再逐條過一遍使用的api發現擷取content的xml api 需要調用xmlfree 來手動釋放。

總結:

           由于以前都是在嵌入平台開發,跑的到時單片機,dsp,系統基本不用動态申請記憶體,沒有記憶體洩露調試經驗

           定位這個問題還是花了基本一天的時間。實際上每次問題的出現都是一個很好的學習機會

繼續閱讀