dmalloc檢測程式記憶體洩漏

2021-07-27 17:49:02 字數 2495 閱讀 3971

一、生成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才會正常...