內存調試MEMWATCH

內存調試 - 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一下

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章