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

Memwatch Tool

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

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

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

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

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

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

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

        涉及的函數(shù)主要有:

mwInit()    mwTerm()    mwAbort()

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

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

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

        涉及的函數(shù)主要有:

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

mwSetAriAction()    mwAriHandler()  mwBreakOut()

1.4 MemWatch對C++的支持
        可以將MemWatch用于C++,但是不推薦這么做。請?jiān)敿?xì)閱讀memwatch.h中關(guān)于對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機(jī)制( 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定義。

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

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

mwSetAriFunc:

        設(shè)置“Abort, Retry, Ignore”發(fā)生時的MemWatch調(diào)用的函數(shù).當(dāng)這樣設(shè)置調(diào)用的函數(shù)地址時,實(shí)際的錯誤消息不會打印出來,但會作為一個參數(shù)進(jìn)行傳遞。

        如果參數(shù)傳遞NULL,ARI處理函數(shù)會被再次關(guān)閉。當(dāng)ARI處理函數(shù)關(guān)閉后, meewatch會自動調(diào)用有mwSetAriAction()指定的操作。

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

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

        同時,設(shè)置ARI函數(shù)也會導(dǎo)致MemWatch不將ARI的錯誤信息寫向標(biāo)準(zhǔn)錯誤輸出,錯誤字符串而是作為'const char *'參數(shù)傳遞到ARI函數(shù).

mwSetAriAction:

        如果沒有ARI處理器被指定,設(shè)置默認(rèn)的ARI返回值。默認(rèn)是MW_ARI_ABORT

mwAriHandler:

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

mwSetOutFunc:

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

mwIsReadAddr:

        檢查內(nèi)存是否有讀取的權(quán)限

mwIsSafeAddr:

        檢查內(nèi)存是否有讀、寫的權(quán)限

mwStatistics:

        設(shè)置狀態(tài)搜集器的行為。對應(yīng)的參數(shù)采用宏定義。

#define MW_STAT_GLOBAL  0       /* 僅搜集全局狀態(tài)信息 */

#define MW_STAT_MODULE  1       /* 搜集模塊級的狀態(tài)信息 */

#define MW_STAT_LINE    2       /* 搜集代碼行級的狀態(tài)信息 */

#define MW_STAT_DEFAULT 0       /* 默認(rèn)狀態(tài)設(shè)置 */

mwBreakOut:

        當(dāng)某些情況MemWatch覺得中斷(break into)編譯器更好時,就調(diào)用這個函數(shù).如果你喜歡使用MemWatch,那么可以在這個函數(shù)上設(shè)置執(zhí)行斷點(diǎn)。

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

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

        測試日期

        狀態(tài)搜集器的信息

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

        MemWatch捕獲的錯誤信息

        內(nèi)存使用的全局信息統(tǒng)計(jì),包括四點(diǎn):1)分配了多少次內(nèi)存 2)最大內(nèi)存使用量3)分配的內(nèi)存總量 4)為釋放的內(nèi)存總數(shù)

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

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

 

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

        mwTerm()用于終止MemWatch.

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

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

        MemWatch不能確保是線程安全的。如果你碰巧使用Wind32或者你使用了線程,作為2.66,是初步支持線程的。定義WIN32或者M(jìn)W_PTHREADS以明確支持線程。這會導(dǎo)致一個全局互斥變量產(chǎn)生,同時當(dāng)訪問全局內(nèi)存鏈時,MemWatch會鎖定互斥變量,但這遠(yuǎn)不能證明是線程安全的。

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


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   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>
            美腿丝袜亚洲色图| 久久久亚洲国产美女国产盗摄| 亚洲国产成人精品女人久久久| 国内成人精品2018免费看| 国产亚洲成精品久久| 一区二区在线视频播放| 亚洲精品一级| 久久久久.com| 亚洲精品孕妇| 香蕉久久久久久久av网站| 久久久久久网址| 欧美日韩国产综合新一区| 国产精品美腿一区在线看| 在线欧美一区| 久久精品国产2020观看福利| 亚洲国产激情| 亚洲国产一区在线观看| 性色av一区二区三区在线观看| 久久影院午夜论| 亚洲精品国产精品国自产在线| 亚洲——在线| 欧美大学生性色视频| 国产欧美va欧美va香蕉在| 日韩亚洲在线| 免费观看30秒视频久久| 亚洲一区二区精品在线观看| 国产一区视频在线看| 91久久久久久国产精品| 麻豆成人在线观看| 一区二区冒白浆视频| 欧美1区2区视频| 午夜视频精品| 亚洲伦理久久| 亚洲国产欧美国产综合一区| 久久综合给合| 亚洲动漫精品| 亚洲一区二区三区视频| 亚洲激情在线激情| 亚洲欧美日韩一区二区三区在线观看| 国产精品v欧美精品v日韩 | 国产精品www色诱视频| 久久久91精品国产一区二区精品| 欧美chengren| 亚洲福利视频一区| 一区二区三区产品免费精品久久75| 亚洲一区二区三区影院| 亚洲免费观看在线视频| 欧美在线一二三区| 国产精品一区二区在线观看网站| 亚洲欧美激情诱惑| 亚洲一区二区在线| 一区二区日韩欧美| 蜜臀a∨国产成人精品| 久久成人精品| 久久久久中文| 久久精品一区二区三区不卡牛牛 | 亚洲人成在线观看| 永久久久久久| 亚洲人成在线观看网站高清| 亚洲福利免费| 久久久久综合| 免费亚洲电影在线| 激情综合色综合久久| 欧美一区中文字幕| 久久久国产精品一区二区三区| 国产精品久久久久久户外露出 | 国外成人在线视频网站| 免费成人激情视频| 在线观看国产欧美| 久久久久久久高潮| 欧美黑人国产人伦爽爽爽| 欧美精品入口| 久久国产精品网站| 国产一二三精品| 亚洲国产日韩美| 99国产精品久久久| 欧美日韩在线播放| 久久综合狠狠综合久久激情| 精品成人一区| 久久综合精品一区| 亚洲国产成人精品久久| 一片黄亚洲嫩模| 久久久噜噜噜久久人人看| 蜜臀av一级做a爰片久久| 尤物九九久久国产精品的特点 | 麻豆精品视频在线| 亚洲黄色大片| 亚洲女人天堂av| 国产一区再线| 欧美高清成人| 久久久欧美一区二区| 黄色一区二区三区四区| 裸体一区二区三区| aa级大片欧美| 亚洲第一伊人| 欧美视频国产精品| 亚洲国产欧美一区二区三区久久 | 久久精品久久99精品久久| 在线 亚洲欧美在线综合一区| 欧美freesex8一10精品| 亚洲一区三区视频在线观看| 老鸭窝毛片一区二区三区| 国产精品久久久久久久9999| 欧美在线免费视屏| 亚洲激情六月丁香| 久久国产主播| 99爱精品视频| 亚洲成色999久久网站| 欧美日韩另类视频| 久久香蕉国产线看观看av| 久久久人成影片一区二区三区观看 | 亚洲视频在线观看网站| 9久re热视频在线精品| 国产区精品视频| 欧美激情国产精品| 久久久91精品国产一区二区精品| 久久精品国产亚洲5555| 一本久久综合| 在线欧美影院| 国精品一区二区| 国产精品日韩电影| 亚洲综合丁香| 久久久噜噜噜久噜久久 | 亚洲视频久久| 欧美日韩专区| 你懂的网址国产 欧美| 香蕉成人久久| 在线视频欧美日韩| 欧美在线三区| 亚洲淫片在线视频| 国产欧美日韩一区二区三区在线观看| 欧美精品久久一区| 男女精品视频| 久久一区亚洲| 久久久久久久性| 欧美一区二区高清| 欧美激情小视频| 麻豆成人小视频| 久久精品在线免费观看| 久久成人这里只有精品| 亚洲欧美视频在线观看视频| 狠狠做深爱婷婷久久综合一区| 国产伦精品一区二区三区| 欧美婷婷在线| 国产精品igao视频网网址不卡日韩| 欧美日本视频在线| 欧美亚洲视频一区二区| 午夜精品免费在线| 欧美专区在线播放| 久久久久久免费| 久久精品最新地址| 久久久久久久一区二区三区| 久久久久网址| 免费观看日韩av| 欧美激情精品| 欧美三级在线| 国产欧美成人| 亚洲第一二三四五区| 亚洲国产精品尤物yw在线观看| 亚洲人成网站精品片在线观看| 国产精品美女在线| 国产日韩欧美在线视频观看| 国内外成人免费激情在线视频网站| 永久免费毛片在线播放不卡| 亚洲国产精品悠悠久久琪琪| av成人毛片| 午夜精品三级视频福利| 久久天天狠狠| 亚洲欧洲在线播放| 亚洲无限乱码一二三四麻| 欧美亚洲在线观看| 欧美 日韩 国产精品免费观看| 欧美女主播在线| 国产日韩视频一区二区三区| 伊人春色精品| 亚洲午夜精品一区二区| 亚洲三级影院| 欧美一区二区三区免费观看视频 | 亚洲视频一二三| 久久国产免费| 亚洲人成小说网站色在线| 亚洲免费婷婷| 嫩草国产精品入口| 国产美女扒开尿口久久久| 亚洲黄色片网站| 欧美影院成年免费版| 欧美国产亚洲精品久久久8v| 亚洲一区二区三区影院| 久久综合网络一区二区| 国产精品你懂得| 91久久精品国产91久久性色tv| 欧美在线资源| 日韩性生活视频| 一区二区高清在线| 一区二区三区高清在线观看| 久久精品在线播放| 国产精品久久99| 一区二区三区精品久久久| 欧美成人精品一区二区三区| 亚洲在线免费观看|