使用gperftools分析c/c++程序內存泄漏和內存錯誤

一、gperftools工具的部署

       從GitHub上下載相應的gperftools-master源碼,以及gperftools-master版本對應的libunwind源碼,我下載的gperftools-master源碼版本對應的是libunwind-0.99;然後編譯libunwind源碼和gperftools-master源碼,然後進行部署,比如:相應的動態庫。

二、查找內存錯誤

       編譯程序時,需要鏈接tcmalloc_debug動態庫,另外如果程序中有捕獲用戶自定義信號的機制,需要首先將捕獲相應的信號屏蔽掉,比如註釋掉捕獲SIGUSER1、SIGUSER2和SIGPROF信號,然後在應用程序運行的環境變量中添加以下環境變量(指定快照生成的路徑和自定義捕獲的信號)

export HEAPPROFILE=/opt/code/profile     

export HEAPPROFILESIGNAL=12

其中profile是生成快照的前綴,一般用戶自定義信號爲12,這裏用12
然後以第一次呼叫結束後生成的heap做爲基準,後面生成的heap做爲對比,生成heap文件的命令爲:kill -s 12 進程號,生成快照的命令爲
pprof  --pdf  二進制文件路徑  --base=基準快照  對比快照 > 輸出文件名.pdf
如:pprof --pdf /opt/recode --base=profile.0003.heap profile.0004.heap > record1.pdf

分析快照
每個分支最後就是可能內存泄漏的地方,可能是這個地方申請的內存沒有釋放或者沒有釋放乾淨,具體分析代碼即可解決。

三、查找內存錯誤

       需要鏈接tcmalloc_debug動態庫,然後gdb掛着程序跑,出現內存錯誤,程序可能會出現崩潰,然後結合gdb調試。

        

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章