一、生成dmalloc靜態庫
編譯方法:
./configure --prefix=/home/***/program/dmalloc-5.5.2/out --enable-threads
make
make install
注:如果使用c++,那麼
make threadscxx
make install
2、把生成的bin和lib copy到板子對應的bin和lib目錄下。
3、重新編譯需要檢測的程式:
makefile裡面增加:-ddmalloc -ddmalloc_func_check -ldmallocthcxx。如果是c程式把-ldmallocthcxx修改為-ldmalloc
編譯好重新放進板子後,設定dmalloc的環境變數
執行./dmalloc -b -l logfile -i 100 low
會看到有兩行輸出:
dmalloc_options=debug=0x4e48503,inter=100,log=logfile
export dmalloc_options
把它設定為環境變數,然後執行自己的程式,會在同乙個目錄下生成乙個logfile檔案,裡面就是記憶體洩漏的資訊。
1488479621: 9438: warning: tried to free(0) from 'ra=0xb6a0f071'
1488479621: 9439: warning: tried to free(0) from 'ra=0xb6a0f0bf'
1488479621: 9440: warning: tried to free(0) from 'ra=0xb6a0f071'
1488479621: 9440: dumping chunk statistics:
1488479621: 9440: basic-block 4096 bytes, alignment 8 bytes
1488479621: 9440: heap address range: 0xa742a000 to 0xb69e6000, 257671168 bytes
1488479621: 9440: user blocks: 6808 blocks, 27601086 bytes (98%)
1488479621: 9440: admin blocks: 27 blocks, 110592 bytes (0%)
1488479621: 9440: total blocks: 6835 blocks, 27996160 bytes
1488479621: 9440: heap checked 0
1488479621: 9440: alloc calls: malloc 4264, calloc 621, realloc 133, free 4422
1488479621: 9440: alloc calls: recalloc 0, memalign 0, valloc 0
1488479621: 9440: alloc calls: new 0, delete 0
1488479621: 9440: current memory in use: 26596574 bytes (1409 pnts)
1488479621: 9440: total memory allocated: 28508463 bytes (5018 pnts)
1488479621: 9440: max in use at one time: 26729359 bytes (1584 pnts)
1488479621: 9440: max alloced with 1 call: 8345216 bytes
1488479621: 9440: max unused memory space: 303713 bytes (1%)
1488479621: 9440: top 10 allocations:
4、提示
dmalloc支援兩種使用方式。
一種是除錯程式只進行dmalloc靜態庫的編譯鏈結(上面介紹的就是這種方式),這種方式的好處是對於**量比較大的現有程式,無需要關心每個.c檔案的編譯細節,只需要將dmalloc靜態庫放在程式依賴的最後面即可。但缺點是針對不同cpu體系需要了解基本的函式返回位址彙編實現,同時即使得到了洩露源的位址變數,但也需要借助gdb、objdump或map檔案等手段得到該洩露源的真正檔案/行號或函式範圍。
還有一種方式除了使用dmalloc靜態庫編譯鏈結外,還需要在每個要除錯的.c程式檔案中加入dmalloc.h檔案的引用,這種方式的原理是使用dmalloc.h標頭檔案的巨集定義將需要除錯的.c程式檔案中的malloc替換為dmalloc_malloc,這種方式的好處和上面方式正好相反,不需要了解不同cpu體系的彙編,不需要借助gdb等工具,因為編譯巨集的替換可以直接使用__file__、__line__巨集,所以得到的除錯資訊直接是可以看到的檔名/行號。但缺點也很明顯,需要保證所有需要除錯的.c程式檔案,都要引用了dmalloc.h標頭檔案。
如:這樣子生成的log裡面直接列印有記憶體洩漏的檔案名字和**行
C C 程式記憶體洩漏檢測
c c 程式記憶體洩漏檢測 摺疊 1.包含標頭檔案和定義 define crtdbg map alloc include include 如果定義了 crtdbg map alloc,列印出來的是檔名和行數等更加直觀的資訊。2.方法一 在程式入口寫幾個語句 int tmpflag crtsetdbg...
記憶體洩漏檢測
一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般 最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的 reboot才會...
記憶體洩漏檢測
一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的reboot才會正常...