【轉】 memwatch使用說明書

memwatch使用說明書

1.memwatch是什麼?
    memwatch是C語言的內存檢測器。除了檢測內存的功能外,它一樣能夠作其它的一些事情,而咱們主要仍是在於講述它的基本功能。若是你真的想要知道全部相關的具體細節,可詳細查看頭文件memwatch.h以及源代碼。那裏面有具體且詳細的註釋說明。

2.如何獲取最新的版本?
    http://www.linkdata.se/sourcecode.html
    ftp://ftp.linkdata.se/pub/memwatch/

3.它是如何工做的?
    它使用C於處理器的功能,memwatch使用它本身定義的功能函數取代全部在你的程序中用ANSI C定義的內存分配函數,memwatch的內存分配函數包含了了全部的分配記錄信息。
    memwatch功能默認不是開啓的,除非定義了MEMWATCH,不然在代碼中不會跟蹤相關的內存使用狀況。
    memwatch一般將它的數據寫入到memwatch.log文件中,但它也能夠被重定向。稍後,看I/O部分。

4.咱們是否能在C++源碼中使用?
    答案是能夠的,可是咱們並不推薦使用。C++容許私有的類去管理本身的內存。若是處理器使用memwatch功能不恰當的話,可能會引發一些意想不到的結果。
    若是你沒有這樣的類,或者你有但仍是想測試一下memwatch的話,你能夠嘗試一下。
    首先,在memwatch中啓用支持C++的代碼。若是你不能找到,多是不該該使用。而後,在你的源代碼中,在全部的頭文件中包含如下的定義:
    #define new mwNew
    #define delete mwDelete
    如此,在調用new及delete函數的時候,會被定向到memwatch中。同時,也請務必閱讀全部在memwatch.h中關於支持C++的文本。

5.使用它,線程安全嗎?
    對此,我表示懷疑。在2.66版本中,有初步支持線程。若是你碰巧使用了Win32或者擁有線程,請定義WIN32或MW_PTHREADS來聲明。

6.初始化及清除
    爲了可以及時的工做,memwatch須要作一些啓動及初始化的工做。mwInit()初始化memwatch,而mwTerm()終止它。若是你沒有本身調用mwInit()的話,memwatch也能夠自動初始化。這樣的話,memwatch就要使用atexit()註冊mwTerm()到atexit隊列中。
    若是你本身使用了atexit()去做清除工做,自動初始化技術會有一個警告。memwatch可能會在程序完成前已經終止。處於安全的考慮,請使用mwInit()和mwTerm()。
    在一個程序終止可控的方式下,你可能要使用mwAbort()來替代mwTerm()。mwAbort()將會中止memwatch,即便還有未處理的mwTerm()。

7.I/O操做
    在正常操做的狀況下,memwatch會建立一個名叫memwatch.log的文件。但有的時候,memwatch.log文件並不能被建立。此時,memwatch會嘗試建立命名相似memwatNN.log的文件,其中NN是01到99之間的數字。若是仍是失敗,則沒有log文件。
    若是你不能使用log文件,或者不但願使用,不用擔憂,可使用參數爲「int
    func(const char*)」的mwSetOutFunc()函數,這樣全部的輸出都會以字符的形式重定向到那裏。
    當使用 ASSERT或VERIFY失敗時,memwatch一樣擁有停止/重試/忽略處理功能。默認的處理程序沒有I/O相關的操做,但會自動終止程序。你可使用你但願的任何處理函數,僅須要將"int
    func(const char*)"的地址傳遞給mwSetAriFunc()。更多的細節,請參考memwatch.h。

8.停止/重試/忽略宏定義
    memwatch定義了停止/重試/忽略相關的宏。若是你已經使用了這些宏,memwatch2.61及以上版本也會定義宏mwTRACE,mwASSERT和mwVERIFY,因此你能夠放心的使用這些。
    爲了確保現有這些宏定義是被保留的,你能夠定義MW_NOTRACE,MW_NOASSERT和
    MW_NOVERIFY。全部的memwatch版本都會遵循這些原則。

9.系統會如何變慢?
    memwatch會使系統速度減慢。大的內存分配不會影響到,你能夠做一些測試,但小的內存分配將使用編譯器的分配功能。最壞的狀況,速度變慢3-5倍。
    釋放的時候,更糟糕。memwatch在釋放內存的時候,將會檢測更多的東西。速度變慢爲5-7倍,無論內存是多大。

10.應用程序的壓力測試
    在模擬低內存使用環境的時候可使用mwLimit()。mwLimit()使用最大數量的字節分配,當限制被擊穿的時候,分配請求將會失敗,相關限制的信息將會被記錄。
    若是碰到一個真正的低內存狀況,memwatch log文件會記錄這一切。memwatch自己有一些保留內存,這樣即便是在最惡劣的條件下,它也能夠正常運行。

11.追蹤野指針寫入和其它使人討厭的事情
    野指針寫入一般是使用沒有初始化的指針引發的,或者是已經初始化,但指針所指向的內存已改變或者已被釋放。避免該類狀況最好的辦法就是始終將指針初始化爲NULL,在釋放完內存的時候,將指針一樣指向NULL。
    爲了幫助追蹤未初始化的指針,memwatch將全部的內存賦予了一些肯定的值。當分配內存的時候包含0xFE,當釋放內存的時候包含0xFD。因此若是你的程序崩潰時使用memwatch而不是沒有memwatch,這極可能是你沒有初始化你所分配的內存,或者使用了已經被釋放掉的內存區。
    在這種狀況下,野指針會破壞memwatch的內部數據結構。memwatch採用校驗,某些數據屢次備份的方式,這樣也能夠修復它本身的數據結構。
    若是你是一個偏執的人,做爲一個程序員你應該這樣,你可使用memwatch的mwIsReadAddr()和mwIsSafeAddr()兩個函數來檢測可訪問的內存。在ANSI C系統及Win32系統下,都是可執行的。僅須要把mwASSERT()放在須要測試的地方,而後忘記它。

12.我能夠幫忙嗎?
    好的,能夠。例如,我喜歡memwatch編譯時沒有任何的警告及錯誤。若是你使用的是兼容ANSI C的編譯器,且有警告或錯誤,若是能夠的話,請給我發郵件,告訴我細節及解決這些問題的方法。
    其它的事情你也能夠作,若是你決定使用memwatch,請發郵件告訴我你項目的名字或URL(若是能夠的話),硬件,操做系統,編譯器,及使用者。接着,我會在memwatch使用者列表中更新信息。
    (http://www.linkdata.se/memwatchusers.html)

13.使用memwatch的五大問題
    a.當編譯的時候沒有使用MEMWATCH。症狀:memwatch盡職盡責地禁用自己。治癒:嘗試在命令行中加入-DMEMWATCH。
    b.在當前目錄下沒有寫的權限。症狀:好似memwatch不能正常工做。治癒:使用mwSetOutFunc()重定向輸出。
    c.在全部的頭文件中忘記添加memwatch.h。症狀:會有"WILD free"和"unfreed"信息。治癒:確保包括了memwatch.h。
    d.當使用atexit()時依靠自動初始化。症狀:致使有"unfreed"和"WILD free"信息。治癒:使用Use mwInit()和mwTerm()。 
    e.將一個不是使用memwatch分配的指針傳遞給memwatch的free函數。症狀:致使一個"WILD free"的錯誤信息。治癒:包括memwatch.h到相應的文件中,或者使用mwFree_()來釋放。    


做者:txgcwm
時間:2012-2-25     17:59
備註:轉載請說明出處
 原文連接:http://blog.chinaunix.net/uid-25885064-id-3082686.html
相關文章
相關標籤/搜索