青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Memwatch Tool

Posted on 2008-07-01 10:12 T.S Liu 閱讀(875) 評論(0)  編輯 收藏 引用 所屬分類: linux_bug_tool

1 介紹
        MemWatch由 Johan  Lindh 編寫,是一個開放源代碼 C 語言內存錯誤檢測工具。MemWatch支持 ANSI C,它提供結果日志紀錄,能檢測雙重釋放(double-free)、錯誤釋放(erroneous free)、內存泄漏(unfreed memory)、溢出(Overflow)、下溢(Underflow)等等。

1.1 MemWatch的內存處理
        MemWatch將所有分配的內存用0xFE填充,所以,如果你看到錯誤的數據是用0xFE填充的,那就是你沒有初始化數據。例外是calloc(),它會直接把分配的內存用0填充。

        MemWatch將所有已釋放的內存用0xFD填充(zapped with 0xFD).如果你發現你使用的數據是用0xFD填充的,那你就使用的是已釋放的內存。在這種情況,注意MemWatch會立即把一個"釋放了的塊信息"填在釋放了的數據前。這個塊包括關于內存在哪兒釋放的信息,以可讀的文本形式存放,格式為"FBI<counter>filename(line)"。如:"FBI<267>test.c(12)".使用FBI會降低free()的速度,所以默認是關閉的。使用mwFreeBufferInfo(1)開啟。

        為了幫助跟蹤野指針的寫情況,MemWatch能提供no-mans-land(NML)內存填充。no-mans-land將使用0xFC填充.當no-mans-land開啟時,MemWatch轉變釋放的內存為NML填充狀態。

1.2初始化和結束處理
        一般來說,在程序中使用MemWatch的功能,需要手動添加mwInit()進行初始化,并用對應的mwTerm ()進行結束處理。

        當然,如果沒有手動調用mwInit(),MemWatch能自動初始化.如果是這種情形,memwatch會使用atext()注冊mwTerm()用于atexit-queue. 對于使用自動初始化技術有一個告誡;如果你手動調用atexit()以進行清理工作,memwatch可能在你的程序結束前就終止。為了安全起見,請顯式使用mwInit()和mwTerm().

        涉及的函數主要有:

mwInit()    mwTerm()    mwAbort()

1.3 MemWatch的I/O 操作
        對于一般的操作,MemWatch創建memwatch.log文件。有時,該文件不能被創建;MemWatch會試圖創建memwatNN.log文件,NN在01~99之間。

        如果你不能使用日志,或者不想使用,也沒有問題。只要使用類型為"void func(int c)"的參數調用mwSetOutFunc(),然后所有的輸出都會按字節定向到該函數.

        當ASSERT或者VERIFY失敗時,MemWatch也有Abort/Retry/Ignore處理機制。默認的處理機制沒有I/O操作,但是會自動中斷程序。你可以使用任何其他Abort/Retry/Ignore的處理機制,只要以參數"void func(int c)"調用mwSetAriFunc()。后面在1.2使用一節會詳細講解。

        涉及的函數主要有:

mwTrace()           mwPuts()        mwSetOutFunc()  mwSetAriFunc()

mwSetAriAction()    mwAriHandler()  mwBreakOut()

1.4 MemWatch對C++的支持
        可以將MemWatch用于C++,但是不推薦這么做。請詳細閱讀memwatch.h中關于對C++的支持。

2 使用
2.1 為自己的程序提供MemWatch功能
        在要使用MemWatch的.c文件中包含頭文件"memwatch.h"

        使用GCC編譯(注意:不是鏈接)自己的程序時,加入-DMEMWATCH -DMW_STDIO
        如:gcc -DMEMWATCH -DMW_STDIO –o test.o –c  test1.c

 

2.2 使用MemWatch提供的功能
1)在程序中常用的MemWatch功能有:

        mwTRACE ( const char* format_string, ... );
或TRACE ( const char* format_string, ... );

        mwASSERT ( int, const char*, const char*, int )
或ASSERT ( int, const char*, const char*, int )

        mwVERIFY ( int, const char*, const char*, int )
或VERIFY ( int, const char*, const char*, int )

        mwPuts ( const char* text )

        ARI機制( mwSetAriFunc(int (*func)(const char *)),
          mwSetAriAction(int action),
          mwAriHandler ( const char* cause ))

        mwSetOutFunc (void (*func)(int))

        mwIsReadAddr(const void *p, unsigned len )

        mwIsSafeAddr(void *p, unsigned len )

        mwStatistics ( int level )

        mwBreakOut ( const char* cause)

 

        2)mwTRACE,mwASSERT,mwVERIFY和mwPuts顧名思義,就不再贅述。僅需要注意的是,Memwatch定義了宏TRACE,    ASSERT 和 VERIFY.如果你已使用同名的宏,memwatch2.61及更高版本的memwatch不會覆蓋你的定義。MemWatch2.61及以后,定義了mwTRACE, mwASSERT 和 mwVERIFY宏,這樣,你就能確定使用的是memwatch的宏定義。2.61版本前的memwatch會覆蓋已存在的同名的TRACE, ASSERT 和 VERIFY定義。

        當然,如果你不想使用MemWatch的這幾個宏定義,可以定義MW_NOTRACE, MW_NOASSERT 和 MW_NOVERIFY宏,這樣MemWatch的宏定義就不起作用了。所有版本的memwatch都遵照這個規則。

        3)ARI機制即程序設置的“Abort, Retry, Ignore選擇陷阱。

mwSetAriFunc:

        設置“Abort, Retry, Ignore”發生時的MemWatch調用的函數.當這樣設置調用的函數地址時,實際的錯誤消息不會打印出來,但會作為一個參數進行傳遞。

        如果參數傳遞NULL,ARI處理函數會被再次關閉。當ARI處理函數關閉后, meewatch會自動調用有mwSetAriAction()指定的操作。

        正常情況下,失敗的ASSERT() or VERIFY()會中斷你的程序。但這可以通過mwSetAriFunc()改變,即通過將函數"int myAriFunc(const char *)"傳給它實現。你的程序必須詢問用戶是否中斷,重試或者忽略這個陷阱。返回2用于Abort, 1用于Retry,或者0對于Ignore。注意retry時,會導致表達式重新求值.

        MemWatch有個默認的ARI處理器。默認是關閉的,但你能通過調用mwDefaultAri()開啟。注意這仍然會中止你的程序除非你定義MEMWATCH_STDIO允許MemWatch使用標準C的I/O流。

        同時,設置ARI函數也會導致MemWatch不將ARI的錯誤信息寫向標準錯誤輸出,錯誤字符串而是作為'const char *'參數傳遞到ARI函數.

mwSetAriAction:

        如果沒有ARI處理器被指定,設置默認的ARI返回值。默認是MW_ARI_ABORT

mwAriHandler:

        這是個標準的ARI處理器,如果你喜歡就盡管用。它將錯誤輸出到標準錯誤輸出,并從標準輸入獲得輸入。

mwSetOutFunc:

        將輸出轉向調用者給出的函數(參數即函數地址)。參數為NULL,表示把輸出寫入日志文件memwatch.log.

mwIsReadAddr:

        檢查內存是否有讀取的權限

mwIsSafeAddr:

        檢查內存是否有讀、寫的權限

mwStatistics:

        設置狀態搜集器的行為。對應的參數采用宏定義。

#define MW_STAT_GLOBAL  0       /* 僅搜集全局狀態信息 */

#define MW_STAT_MODULE  1       /* 搜集模塊級的狀態信息 */

#define MW_STAT_LINE    2       /* 搜集代碼行級的狀態信息 */

#define MW_STAT_DEFAULT 0       /* 默認狀態設置 */

mwBreakOut:

        當某些情況MemWatch覺得中斷(break into)編譯器更好時,就調用這個函數.如果你喜歡使用MemWatch,那么可以在這個函數上設置執行斷點。

        其他功能的使用,請參考源代碼的說明。

2.3分析日志文件
        日志文件memwatch.log中包含的信息主要有以下幾點:

        測試日期

        狀態搜集器的信息

        使用MemWatch的輸出函數或宏(如TRACE等)的信息。

        MemWatch捕獲的錯誤信息

        內存使用的全局信息統計,包括四點:1)分配了多少次內存 2)最大內存使用量3)分配的內存總量 4)為釋放的內存總數

        MemWatch捕獲的錯誤記錄在日志文件中的輸出格式如下:

message: <sequence-number> filename(linenumber), information

 

2.4 注意事項
        mwInit()和mwTerm()是對應的.所以使用了多少次mwInit(),就需要調用多少次

        mwTerm()用于終止MemWatch.

        如果在流程中捕獲了程序的異常中斷,那么需要調用mwAbort()而不是

        mwTerm()。即使有顯示的調用mwTerm(),mwAbort()也將終止MemWatch。

        MemWatch不能確保是線程安全的。如果你碰巧使用Wind32或者你使用了線程,作為2.66,是初步支持線程的。定義WIN32或者MW_PTHREADS以明確支持線程。這會導致一個全局互斥變量產生,同時當訪問全局內存鏈時,MemWatch會鎖定互斥變量,但這遠不能證明是線程安全的。

3 結論
        從MemWatch的使用可以得知,無法用于內核模塊。因為MemWatch自身就使用了應用層的接口,而不是內核接口。但是,對于普通的應用層程序,我認為還是比較有用,并且是開源的,可以自己修改代碼實現;它能方便地查找內存泄漏,特別是提供的接口函數簡單易懂,學習掌握很容易,對應用層程序的單元測試會較適用。


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲激情专区| 老司机精品视频一区二区三区| 欧美成人午夜视频| 欧美激情一区二区三区在线视频| 日韩视频精品在线| 亚洲性视频网址| 1024国产精品| 亚洲午夜影视影院在线观看| 精品51国产黑色丝袜高跟鞋| 亚洲盗摄视频| 欧美日韩一区二区免费在线观看 | 久久琪琪电影院| 欧美99久久| 久久国产福利| 免费成人av在线| 欧美一区二区大片| 欧美人成在线视频| 噜噜噜91成人网| 国产伦精品一区二区三区四区免费| 蜜桃av久久久亚洲精品| 国产精品高精视频免费| 亚洲国产日韩欧美| 国产精品视频久久一区| 亚洲人成亚洲人成在线观看图片| 欧美主播一区二区三区美女 久久精品人| 国产综合香蕉五月婷在线| 欧美激情一区二区三区在线视频| 欧美日韩视频免费播放| 免播放器亚洲一区| 国产精品第2页| 久久中文字幕一区二区三区| 国产精品久久二区| 亚洲精品欧美日韩| 亚洲高清网站| 久久国产福利| 欧美一级播放| 欧美调教vk| 亚洲日本黄色| 亚洲精品一区二区在线| 国产日本欧美一区二区三区| 亚洲欧美日韩精品| 欧美风情在线观看| 久久免费99精品久久久久久| 国产精品社区| 日韩亚洲精品视频| 99av国产精品欲麻豆| 理论片一区二区在线| 欧美亚洲在线| 国产精品网站在线观看| 亚洲精品国产精品乱码不99| 亚洲第一区在线| 久久99伊人| 欧美有码视频| 国产欧美一区视频| 亚洲一区二区精品视频| 亚洲天天影视| 欧美视频在线免费看| 欧美一区二区三区免费观看| 欧美精品麻豆| 欧美国产精品| 亚洲福利电影| 久久久久久九九九九| 久久久久9999亚洲精品| 欧美日韩在线看| 99视频+国产日韩欧美| 99精品热视频| 欧美精品久久久久久久久久| 久久天堂成人| 一区二区亚洲欧洲国产日韩| 亚洲综合色婷婷| 亚洲一区精品电影| 国产精品视频yy9099| 99精品欧美| 欧美一区二区在线| 欧美天天影院| 欧美综合激情网| 欧美成年人网站| 99精品欧美一区二区蜜桃免费| 国产精品igao视频网网址不卡日韩| 在线视频一区观看| 久久久亚洲精品一区二区三区| 136国产福利精品导航| 欧美精品一区二区三区久久久竹菊| 在线视频一区观看| 美国成人毛片| 一区二区三区成人| 国产精品美腿一区在线看| 亚洲欧美日韩天堂一区二区| 老司机亚洲精品| 夜夜嗨av一区二区三区网页| 国产精品乱子乱xxxx| 久久综合九色综合久99| 日韩一区二区久久| 免费在线看一区| 亚洲图片激情小说| 尤物yw午夜国产精品视频明星| 欧美日本成人| 久久免费视频在线观看| 在线视频精品一区| 欧美福利影院| 亚洲女同同性videoxma| 亚洲丶国产丶欧美一区二区三区| 欧美四级伦理在线| 久久综合婷婷| 欧美一区二区三区四区视频| 91久久中文字幕| 欧美专区在线| 亚洲一区二区三区四区视频| 在线播放一区| 国产欧美日韩视频在线观看| 欧美成人午夜免费视在线看片 | 欧美三级午夜理伦三级中视频| 亚洲欧美日韩一区二区三区在线观看| 欧美不卡高清| 欧美专区在线| 亚洲一区二区在线看| 一区在线电影| 国产欧美一区二区三区视频 | 亚洲欧美成人在线| 国产亚洲欧美激情| 欧美成人一区二区在线| 亚洲欧美日本日韩| 一区二区三区国产精华| 亚洲国产一区二区a毛片| 美女视频黄a大片欧美| 久久高清国产| 亚洲一区二区黄| 99视频在线精品国自产拍免费观看| 欧美成人一品| 午夜伦欧美伦电影理论片| 亚洲电影视频在线| 欧美福利电影在线观看| 久久精品中文字幕一区| 午夜精品福利在线观看| 亚洲精品视频在线看| 激情欧美日韩| 国产精品视频一| 欧美日韩亚洲视频| 久久精品视频导航| 久久福利电影| 久久综合色影院| 久久婷婷国产综合尤物精品| 久久久999成人| 久久精品成人一区二区三区蜜臀 | 在线观看一区视频| 在线观看国产精品淫| 亚洲二区免费| 亚洲伦理中文字幕| 亚洲一区二区伦理| 午夜视频在线观看一区二区| 性欧美大战久久久久久久免费观看| 午夜精品久久一牛影视| 久久精品成人欧美大片古装| 久久国产精品99国产| 久久免费黄色| 欧美国产综合视频| 亚洲精品久久在线| 亚洲午夜精品网| 欧美一激情一区二区三区| 久久精品国产精品亚洲综合| 久久久久久久综合色一本| 免费观看久久久4p| 欧美三级电影精品| 国产精品久久久久久亚洲毛片| 国产视频丨精品|在线观看| 黄色成人在线观看| 国产亚洲精品美女| 亚洲日本欧美| 亚洲午夜av| 中文久久精品| 欧美一区网站| 欧美大香线蕉线伊人久久国产精品| 亚洲国产精品成人久久综合一区| 亚洲毛片在线免费观看| 欧美在线播放一区| 欧美精品亚洲精品| 国产嫩草影院久久久久| 精品福利电影| 一区二区三区精品国产| 久久久久国产一区二区| 亚洲国产一区二区三区高清| 中文av一区二区| 久久综合一区二区三区| 国产精品草草| 国产曰批免费观看久久久| 一区二区三区日韩欧美| 久久免费国产精品1| 亚洲成人在线网| 亚洲男女自偷自拍| 欧美福利视频一区| 国产一区二区久久精品| 中文亚洲欧美| 欧美大片免费观看在线观看网站推荐 | 99精品国产在热久久| 久久综合影视| 国产视频在线观看一区二区三区 | 欧美中文字幕第一页| 欧美成人精品福利| 国产日韩视频一区二区三区| 亚洲国产网站|