1. 程式人生 > 實用技巧 >linux 下 定位記憶體洩漏 valgrind

linux 下 定位記憶體洩漏 valgrind

排查專案中遇到的記憶體洩露問題,用到valgrind工具,記錄下具體的用法以及注意事項,以備後用。

首先要明確的是valgrind 是可靠的:剛開始使用valgrind測試出一些記憶體洩漏點,通過程式碼發現及日誌跟

蹤,發現流程上“沒有問題”,一度懷疑valgrind 是不是報告假訊息。後來所有報出來的洩漏點均證實確實

存在洩露。 下面介紹下valgrind基本使用方法:

如果系統沒有安裝valgrind,首先得安裝下,我們測試的系統是Ubuntu16.04,直接 sudo apt-get install

valgrind 在命令列如下命令:

root@Ubuntu16:~# valgrind --tool=memcheck --leak-check=full  --show-reachable=yes --log-file=./mem.txt ./CGServer

程式執行一段程式後結束程式執行,檢視生成的檔案(上面的命令指定了日誌檔名為mem.txt),示例日誌

檔案內容 如下圖所示:

圖1. 示例日誌內容

需要注意的是提示still reachable的地方 也有可能是洩露點。still reachable 原意是仍然可以被釋放,如果是

庫初始化處提示still reachable 沒有問題,因為只有程式不退出,不能被釋放。如果被反覆呼叫的介面處也提示

still reachable 基本上都屬於記憶體洩露,需要解決。

另外呼叫malloc分配的記憶體 free後記憶體不一定會立即交還作業系統,glibc有自己的記憶體管理機制。預設分配超

過128K的記憶體,free後會記憶體會立即交還作業系統(這個閾值可通過mallopt介面設定M_MMAP_THRESHOLD進

行修改)。小於128K先快取起來,適當的時候釋放。如果希望儘快釋放記憶體可執行mall_trim(0)(可單獨開啟一個線

程定時執行該方法,該方法可釋放本程序內其他執行緒free後的記憶體(交還作業系統))。 相比之下Windows系統下

記憶體釋放沒有這個問題呼叫free介面後一定是及時釋放記憶體的。

linux下 檢視程式佔用的記憶體可通過 top -p 程序Pid 命令進行檢視,整體上該命令輸出的程序記憶體資訊是準確的,

通過該命令檢視程序記憶體如果程序佔用記憶體一直增加 一定是有問題的。

如需交流可加QQ群766718184,1038388075 或者QQ3501870,

視訊下載地址:http://www.chungen90.com/?news_3/

Demo下載地址:http://www.chungen90.com/?news_2