一、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調試。