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,系統基本不用動态申請記憶體,沒有記憶體洩露調試經驗
定位這個問題還是花了基本一天的時間。實際上每次問題的出現都是一個很好的學習機會