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

Memwatch Tool

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

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

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

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

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

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

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

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

mwInit()    mwTerm()    mwAbort()

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

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

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

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

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

mwSetAriAction()    mwAriHandler()  mwBreakOut()

1.4 MemWatch對(duì)C++的支持
        可以將MemWatch用于C++,但是不推薦這么做。請(qǐng)?jiān)敿?xì)閱讀memwatch.h中關(guān)于對(duì)C++的支持。

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

        使用GCC編譯(注意:不是鏈接)自己的程序時(shí),加入-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不會(huì)覆蓋你的定義。MemWatch2.61及以后,定義了mwTRACE, mwASSERT 和 mwVERIFY宏,這樣,你就能確定使用的是memwatch的宏定義。2.61版本前的memwatch會(huì)覆蓋已存在的同名的TRACE, ASSERT 和 VERIFY定義。

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

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

mwSetAriFunc:

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

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

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

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

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

mwSetAriAction:

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

mwAriHandler:

        這是個(gè)標(biāo)準(zhǔn)的ARI處理器,如果你喜歡就盡管用。它將錯(cuò)誤輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出,并從標(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)搜集器的行為。對(duì)應(yīng)的參數(shù)采用宏定義。

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

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

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

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

mwBreakOut:

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

        其他功能的使用,請(qǐng)參考源代碼的說明。

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

        測(cè)試日期

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

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

        MemWatch捕獲的錯(cuò)誤信息

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

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

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

 

2.4 注意事項(xiàng)
        mwInit()和mwTerm()是對(duì)應(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以明確支持線程。這會(huì)導(dǎo)致一個(gè)全局互斥變量產(chǎn)生,同時(shí)當(dāng)訪問全局內(nèi)存鏈時(shí),MemWatch會(huì)鎖定互斥變量,但這遠(yuǎn)不能證明是線程安全的。

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


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(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>
            亚洲伊人一本大道中文字幕| 亚洲神马久久| 亚洲欧美日韩中文视频| 精品成人一区二区| 亚洲激情在线| 欧美一区二区网站| 亚洲国产成人精品视频| 亚洲性人人天天夜夜摸| 日韩亚洲视频| 男女激情视频一区| 国产亚洲一二三区| 亚洲在线视频| 国产亚洲欧洲| 午夜精品免费在线| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产精品多人| 最新亚洲激情| 美女尤物久久精品| 亚洲一卡二卡三卡四卡五卡| 欧美激情亚洲综合一区| 久久九九免费视频| 国产精品qvod| 亚洲最新色图| 亚洲国产欧洲综合997久久| 一区二区三区偷拍| 亚洲性av在线| 麻豆视频一区二区| 欧美视频一区二区| 极品少妇一区二区三区| 亚洲伦理在线| 国产毛片一区二区| 在线视频亚洲| 91久久精品国产91久久性色tv| 久久久天天操| 激情丁香综合| 美女黄网久久| 免费成人黄色av| 亚洲国产精品成人一区二区 | 中日韩男男gay无套| 欧美国产第一页| 99热精品在线| 99国产精品| 国产精品爱久久久久久久| 一本一本a久久| 一本久道综合久久精品| 国产精品福利片| 久久精品成人一区二区三区蜜臀| 亚洲三级色网| 欧美日韩日本网| 亚洲欧洲在线免费| 久久精品国产第一区二区三区| 99在线精品视频| 国产农村妇女精品| 亚洲视频一区二区| 亚洲一区二区免费视频| 99av国产精品欲麻豆| 国产精品九九| 久久久综合网站| 久久成人18免费网站| 久久久久久有精品国产| 亚洲欧洲精品一区二区三区不卡| 欧美大片网址| 欧美三级日本三级少妇99| 欧美一级电影久久| 久久精品国产视频| 日韩一级精品视频在线观看| 亚洲视频在线观看三级| 国产一区二区三区四区在线观看| 欧美成人国产va精品日本一级| 欧美激情aaaa| 欧美一级艳片视频免费观看| 久久综合成人精品亚洲另类欧美| 一区二区三区免费看| 欧美在线综合| 一区二区高清视频在线观看| 亚洲欧美一区二区精品久久久| 亚洲国产欧美久久| 亚洲在线第一页| 亚洲精品乱码| 久久99在线观看| 亚洲无吗在线| 麻豆精品视频在线观看视频| 欧美一级免费视频| 欧美国产视频在线观看| 久久精品2019中文字幕| 欧美激情综合色综合啪啪| 久久国产99| 欧美日韩午夜剧场| 免费成人黄色片| 国产精品一区免费观看| 亚洲精品久久久久久久久久久| 国产曰批免费观看久久久| 夜夜嗨av一区二区三区四区| 亚洲激情成人网| 久久国产精品99久久久久久老狼| 亚洲一区在线播放| 欧美精品久久天天躁| 免费观看国产成人| 国产亚洲欧美日韩美女| 夜夜嗨av一区二区三区网站四季av| 欧美日韩日韩| 亚洲日本成人女熟在线观看| 最新日韩在线视频| 久久综合色播五月| 久久只精品国产| 国产一区二区无遮挡| 亚洲黄色免费网站| 蜜桃久久精品一区二区| 久久精品国产综合| 国产精品成人免费视频| 夜色激情一区二区| 国产精品亚发布| 亚洲免费在线视频一区 二区| 久久久另类综合| 久久免费精品视频| 国产美女诱惑一区二区| 中日韩午夜理伦电影免费| 亚洲一区二区三区四区在线观看 | 欧美日韩国产123区| 亚洲国产另类精品专区| 亚洲欧洲日产国产综合网| 美女日韩在线中文字幕| 免费亚洲一区| 亚洲国内高清视频| 欧美大色视频| 亚洲伦理精品| 亚洲一区网站| 国产一区白浆| 亚洲一区二区久久| 日韩香蕉视频| 欧美日韩一区二区三区在线 | 一区二区三区不卡视频在线观看 | 欧美国产视频在线| 亚洲三级免费| 欧美一区2区三区4区公司二百| 国产模特精品视频久久久久| 欧美亚洲系列| 欧美国产第一页| 妖精成人www高清在线观看| 欧美日韩在线播放一区| 一区二区欧美国产| 欧美一级成年大片在线观看| 韩日在线一区| 欧美精品在线一区| 亚洲欧美日韩在线不卡| 狼狼综合久久久久综合网| 亚洲人永久免费| 久久精品99无色码中文字幕| 亚洲激情在线观看| 欧美日韩裸体免费视频| 亚洲精品永久免费| 日韩一区二区精品视频| 国产精品美女久久久久久免费 | 亚洲第一精品电影| 久久国产精品99国产精| 亚洲国产三级| 欧美在线资源| 亚洲欧洲精品一区| 国产伦精品一区二区三区高清| 麻豆精品91| 亚洲欧美日韩国产中文| 亚洲国产精品www| 久久精品免费| 在线视频欧美精品| 亚洲高清久久久| 国产免费亚洲高清| 欧美国产精品v| 亚洲欧美激情一区二区| 美女日韩欧美| 欧美一区二区三区在线视频| 国外成人性视频| 欧美麻豆久久久久久中文| 欧美一级播放| 亚洲精品偷拍| 欧美成人自拍| 久久精品国产亚洲aⅴ| 亚洲午夜一区二区三区| 亚洲国产成人精品久久久国产成人一区| 国产精品久久网站| 欧美韩日视频| 久久综合亚州| 久久精品国产亚洲5555| 在线亚洲精品| 日韩午夜在线电影| 亚洲国产老妈| 亚洲国产欧美一区二区三区同亚洲| 久久久久久久精| 午夜精品电影| 亚洲在线观看免费| 一本大道av伊人久久综合| 亚洲第一精品福利| 樱花yy私人影院亚洲| 国产一区二区三区在线免费观看 | 欧美黄色免费| 麻豆精品在线观看| 久久久精品一区二区三区| 先锋影音国产精品| 亚洲综合精品自拍| 亚洲激情欧美激情| 国产精品乱人伦一区二区|