內存調試 - MEMWATCH
MEMWATCH 由 Johan Lindh 編寫,是一個開放源代碼 C 語言內存錯誤檢測工具,您可以自己下載它(請參閱本文後面部分的參考資料)。只要在代碼中添加一個頭文件並在 gcc 語句中定義了 MEMWATCH 之後,您就可以跟蹤程序中的內存泄漏和錯誤了。MEMWATCH 支持 ANSI C,它提供結果日誌紀錄,能檢測雙重釋放(double-free)、錯誤釋放(erroneous free)、沒有釋放的內存(unfreed memory)、溢出和下溢等等。
1. 下載Memwatch, http://www.linkdata.se/;
2. 解壓後可以看到memwatch.c、memwatch.h、test.c等文件;
2.1 首先運行源代碼中的事例程序,檢測是否捕捉到內存錯誤,具體步驟如下:
Linux and other *nixes with gcc:
gcc -o test -DMEMWATCH -DMEMWATCH_STDIO test.c memwatch.c
Windows 95, Windows NT with MS Visual C++:
cl -DMEMWATCH -DMEMWATCH_STDIO test.c memwatch.c
Then simply run the test program.
./test
成功運行後,會看到一個名爲"memwatch.log" 的文件,裏面記錄了內存泄漏的具體情況。
3. 上面事例運行成功後,就可以將測試自己的代碼了。
3.1 首先將memwatch.c、memwatch.h複製到被測代碼中。
3.2 將源碼中每個文件都包含memwatch.h;如果源碼中的所有文件都用到了一個文件,也可以將其添加到該文件中。
3.3 重新編譯源代碼,並在gcc選項中使用 –DMEMWATCH,如果需要對出錯時進行控制,可以添加-DMEMWATCH_STDIO 選項,此時調試出錯時可以在標準輸出上看到"Abort, Retry,Ignore?”
3.4 編譯成功後,運行程序!如果操作無誤,可以memwatch.log,裏面記錄了內存調試的具體情況。
4. 容易出現的問題
4.1 在memwatch.h之後包含string.h時,編譯時提示strdup()出錯!
解決辦法:可以將string.h放置在memwatch.h之前;也可以修改memwatch.h,使其包含
string.h.
4.2 運行程序後,沒有出現memwatch.log文件
解決辦法:在編譯時可能沒有定義MEMWATCH;也可能是有些文件沒有包含memwatch.h;查看後解決
總結:MEMWATCH 爲您顯示真正導致問題的行。如果您釋放一個已經釋放過的指針,它會告訴您。對於沒有釋放的內存也一樣。日誌結尾部分顯示統計信息,包括泄漏了多少內存,使用了多少內存,以及總共分配了多少內存。
還沒嘗試過的,mark一下