日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

几种内存泄露检测工具的比较

發(fā)布時(shí)間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 几种内存泄露检测工具的比较 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述
內(nèi)存泄漏(memory leak)指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況,在大型的、復(fù)雜的應(yīng)用程序中,內(nèi)存泄漏是常見的問題。當(dāng)以前分配的一片內(nèi)存不再需要使用或無法訪問時(shí),但是卻并沒有釋放它,這時(shí)就出現(xiàn)了內(nèi)存泄漏。盡管優(yōu)秀的編程實(shí)踐可以確保最少的泄漏,但是根據(jù)經(jīng)驗(yàn),當(dāng)使用大量的函數(shù)對(duì)相同的內(nèi)存塊進(jìn)行處理時(shí),很可能會(huì)出現(xiàn)內(nèi)存泄漏。

內(nèi)存泄露可以分為以下幾類:
1. 常發(fā)性內(nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼會(huì)被多次執(zhí)行到,每次被執(zhí)行的時(shí)候都會(huì)導(dǎo)致一塊內(nèi)存泄漏。
2. 偶發(fā)性內(nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過程下才會(huì)發(fā)生。常發(fā)性和偶發(fā)性是相對(duì)的。對(duì)于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的。所以測(cè)試環(huán)境和測(cè)試方法對(duì)檢測(cè)內(nèi)存泄漏至關(guān)重要。
3. 一次性內(nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼只會(huì)被執(zhí)行一次,或者由于算法上的缺陷,導(dǎo)致總會(huì)有一塊且僅一塊內(nèi)存發(fā)生泄漏。比如,在一個(gè)Singleton類的構(gòu)造函數(shù)中分配內(nèi)存,在析構(gòu)函數(shù)中卻沒有釋放該內(nèi)存。而Singleton類只存在一個(gè)實(shí)例,所以內(nèi)存泄漏只會(huì)發(fā)生一次。
4. 隱式內(nèi)存泄漏。程序在運(yùn)行過程中不停的分配內(nèi)存,但是直到結(jié)束的時(shí)候才釋放內(nèi)存。嚴(yán)格的說這里并沒有發(fā)生內(nèi)存泄漏,因?yàn)樽罱K程序釋放了所有申請(qǐng)的內(nèi)存。但是對(duì)于一個(gè)服務(wù)器程序,需要運(yùn)行幾天,幾周甚至幾個(gè)月,不及時(shí)釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存。所以,我們稱這類內(nèi)存泄漏為隱式內(nèi)存泄漏。 (百度百科)

檢測(cè)工具
現(xiàn)在有很多方法來檢測(cè)內(nèi)存泄露,以下列舉了常用的內(nèi)存泄露檢測(cè)工具。

Visual Leak Detecter
應(yīng)用環(huán)境:Windows + VC

編程語言:C/C++

使用方法:只需包含頭文件vld.h,并添加提供的lib

結(jié)果輸出:輸出到VC的調(diào)試窗口中

設(shè)計(jì)思路: 注冊(cè)_CrtSetAllocHook鉤子函數(shù),使用VC自帶的CRT Debug Heap

優(yōu)缺點(diǎn):可以獲得內(nèi)存泄露點(diǎn)的調(diào)用堆棧,可以得到內(nèi)存泄露的完整數(shù)據(jù)

如何獲取:http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio

Bounds Checker
應(yīng)用環(huán)境:Windows + VC6.0

編程語言:C/C++

使用方法:安裝使用,會(huì)自動(dòng)在VC內(nèi)創(chuàng)建右鍵菜單

結(jié)果輸出:輸出到VC的調(diào)試窗口中

設(shè)計(jì)思路: 未知

優(yōu)缺點(diǎn):可以檢測(cè)內(nèi)存泄露;資源泄漏;對(duì)指針的錯(cuò)誤操作,內(nèi)存讀、寫溢出;使用未初始化的內(nèi)存

如何獲取:http://3ddown.com/soft/31594.htm,安裝licence時(shí),需要將日期調(diào)整為2008年,然后安裝licence。有一個(gè)licence安裝后顯示是8.3的,但是可以使用。

mtrace
應(yīng)用環(huán)境:Linux GLIBC

編程語言:C

使用方法: 包含頭文件mcheck.h,定義環(huán)境變量MALLOC_TRACE為輸出文件名,程序開始時(shí)調(diào)用mtrace()即可。

結(jié)果輸出:用戶指定的文件

設(shè)計(jì)思路: 為malloc,realloc,free函數(shù)添加鉤子函數(shù),記錄每一對(duì)malloc-free的執(zhí)行

優(yōu)缺點(diǎn):只能檢查使用malloc/realloc/free造成的的內(nèi)存泄露

如何獲取:GLIBC自帶,可直接使用

memwatch
應(yīng)用環(huán)境:Linux

編程語言:C

使用方法: 加入memwatch.h,編譯時(shí)加上-DMEMWATCH -DMW_STDIO及memwatch.c

結(jié)果輸出:輸出文件名稱為memwatch.log,在程序執(zhí)行期間,錯(cuò)誤提示都會(huì)顯示在stdout上

設(shè)計(jì)思路:將malloc/realloc/calloc/strdup/free等重定義為mwMalloc(sz, FILE, LINE)等,內(nèi)部維護(hù)一個(gè)操作鏈表

優(yōu)缺點(diǎn):能檢測(cè)雙重釋放(double-free)、錯(cuò)誤釋放(erroneous free)、內(nèi)存泄漏(unfreed memory)、溢出(Overflow)、下溢(Underflow)等等

如何獲取:http://memwatch.sourceforge.net/

valgrind
應(yīng)用環(huán)境:Linux

編程語言:C/C++

使用方法: 加入memwatch.h,編譯時(shí)加上-DMEMWATCH -DMW_STDIO及memwatch.c

結(jié)果輸出:輸出文件名稱為memwatch.log,在程序執(zhí)行期間,錯(cuò)誤提示都會(huì)顯示在stdout上

設(shè)計(jì)思路:根據(jù)軟件的內(nèi)存操作維護(hù)一個(gè)有效地址空間表和無效地址空間表(進(jìn)程的地址空間)

優(yōu)缺點(diǎn):能夠檢測(cè):

使用未初始化的內(nèi)存 (Use of uninitialised memory)
使用已經(jīng)釋放了的內(nèi)存 (Reading/writing memory after it has been free’d)
使用超過 malloc分配的內(nèi)存空間(Reading/writing off the end of malloc’d blocks)
對(duì)堆棧的非法訪問 (Reading/writing inappropriate areas on the stack)
申請(qǐng)的空間是否有釋放 (Memory leaks – where pointers to malloc’d blocks are lost forever)
如何獲取:http://valgrind.org/

debug_new
應(yīng)用環(huán)境:Linux/Windows

編程語言:C++

使用方法: 包含頭文件debug_new.h,鏈接debug_new.cpp

結(jié)果輸出:控制臺(tái)console

設(shè)計(jì)思路: 通過重載new和delete操作符來捕獲內(nèi)存申請(qǐng)/釋放請(qǐng)求,并在程序內(nèi)部維護(hù)一個(gè)全局靜態(tài)變量的哈希鏈表。在new操作符中,不僅僅分配用戶所要求的內(nèi)存,而是在為每次分配的內(nèi)存都添加一個(gè)頭部,存儲(chǔ)著此次分配的位置信息和鏈表指針,new返回的是分配的這塊內(nèi)存加上頭部偏移后的值,而在之前已經(jīng)將此返回值作了HASH計(jì)算并添加到HASH鏈表中了。delete的時(shí)候先根據(jù)要釋放的指針地址做HASH計(jì)算,然后再遍歷數(shù)組HASH值處的鏈表進(jìn)行查找,如果找到則將該節(jié)點(diǎn)移除,未找到就abort。這樣在程序結(jié)束之后,通過檢查此數(shù)組中是否還有未釋放的內(nèi)存塊來確定是否有內(nèi)存泄露。

優(yōu)缺點(diǎn):跨平臺(tái),僅用于C++程序,

如何獲取:http://www.ibm.com/developerworks/cn/linux/l-mleak2/index.html

總結(jié)
以上的這些分析工具,所使用的方法大致分為以下幾種:

1、注冊(cè)內(nèi)存分配/釋放鉤子函數(shù)(hook)。在Linux下可以malloc_hook, free_hook等5個(gè)鉤子函數(shù),在Windows下可以注冊(cè)_CrtSetAllocHook鉤子函數(shù),這樣在分配內(nèi)存的時(shí)候就可以捕獲這一請(qǐng)求并加以處理。Visual Leak Detecter和mtrace使用此方式。

2、使用宏定義替換。將用戶代碼中的malloc, free 替換為宏定義的 mwMalloc(sz, FILE, LINE)等自定義函數(shù),從而跟蹤內(nèi)存請(qǐng)求,memwatch即使用此方式。

3、操作符重載。此方法僅用于C++語言中,通過重載new、delete操作符來實(shí)現(xiàn)跟蹤內(nèi)存請(qǐng)求,重載后的操作符類似于鉤子函數(shù)意義。debug_new采用此方式。

這些工具的輸出方式也分以下幾種:

1、Windows VC環(huán)境下一般輸出到調(diào)試窗口中,因此VC本身就提供了一個(gè)理想的輸出場(chǎng)所,并且GUI應(yīng)用程序輸出到標(biāo)準(zhǔn)輸出時(shí)不可見的。Visual Leak Detecter采用此法。

2、輸出到標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯(cuò)誤輸出:控制臺(tái)應(yīng)用程序可以輸出到屏幕,如memwatch, valgrind, debug_new都是采用這種方法。

3、輸出到日志文件:將結(jié)果輸出到用戶指定或默認(rèn)的日志文件中,如mtrace和memwatch。

此外,這些工具的內(nèi)存檢測(cè)方式無非也分為兩種:

1、維護(hù)一個(gè)內(nèi)存操作鏈表,當(dāng)有內(nèi)存申請(qǐng)操作時(shí),將其加入此鏈表中,當(dāng)有釋放操作時(shí),從申請(qǐng)操作從鏈表中移除。如果到程序結(jié)束后此鏈表中還有內(nèi)容,說明有內(nèi)存泄露了;如果要釋放的內(nèi)存操作沒有在鏈表中找到對(duì)應(yīng)操作,則說明是釋放了多次。使用此方法的有VC內(nèi)置的調(diào)試工具,Visual Leak Detecter,mtrace, memwatch, debug_new。

2、模擬進(jìn)程的地址空間。仿照操作系統(tǒng)對(duì)進(jìn)程內(nèi)存操作的處理,在用戶態(tài)下維護(hù)一個(gè)地址空間映射,此方法要求對(duì)進(jìn)程地址空間的處理有較深的理解。因?yàn)閃indows的進(jìn)程地址空間分布不是開源的,所以模擬起來很困難,因此只支持Linux。采用此方法的是valgrind。

總結(jié)

以上是生活随笔為你收集整理的几种内存泄露检测工具的比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲第二页 | 91黄色影视 | 成年人三级视频 | 偷偷色噜狠狠狠狠的777米奇 | 日韩欧美不卡 | 欧美性xxxxxxxxx| 围产精品久久久久久久 | 91视频地址 | 无码人妻精品一区二区蜜桃网站 | 三级久久| 超碰人人做 | 亚洲成人黄色片 | 日韩一区欧美二区 | 中文字幕专区 | 五月中文字幕 | 久爱精品| 欧美精品日韩精品 | 人人91| 欧美日韩国产亚洲沙发 | 国产 欧美 日韩 一区 | 九色porny自拍视频在线播放 | 精品国产欧美一区二区三区成人 | 国内精品久久久久久久久久 | 久久精品色妇熟妇丰满人妻 | 中文字幕免费视频 | 久久综合精品视频 | 插插插操操操 | 男女涩涩网站 | 青青草原综合久久大伊人精品 | 手机看片欧美日韩 | 国产午夜精品一区二区三区欧美 | 久久影院中文字幕 | 你懂的在线观看视频 | 好看的中文字幕 | 中文字幕久久精品 | 欧美亚洲少妇 | 台湾swag在线播放 | 国产免费a级片 | 日韩欧美亚洲在线 | 亚洲第二色| 国产日韩大片 | 日韩有码中文字幕在线 | 极品超粉嫩尤物69xx | 人妻少妇被猛烈进入中文字幕 | 日韩国产欧美精品 | 男人的天堂亚洲 | 久久高清一区 | 无人码人妻一区二区三区免费 | 天堂国产一区二区三区 | 91小仙女jk白丝袜呻吟 | 国内精久久久久久久久久人 | 91麻豆精品国产91久久久更新时间 | 亚洲区欧美区 | 裸体视频软件 | 亚洲成人免费在线 | 91桃色在线观看 | 亚洲国产精品无码久久久久高潮 | 怡红院av久久久久久久 | 国产精选av | 91亚洲欧美| 亚洲综合网在线观看 | 欧美国产日韩一区 | 久久精品亚洲一区二区 | 亚洲大尺度在线观看 | 日韩一区二区三区精品 | 看国产一级片 | 免费视频www在线观看网站 | 国产日韩欧美在线 | 九九视频在线观看 | 午夜中文字幕 | 好吊一区二区三区视频 | 欧美日本韩国一区二区三区 | 鲁鲁在线 | 91精品国产自产91精品 | 亚洲国产日韩欧美 | 欧美激情亚洲色图 | 中字av在线| 久久国产黄色片 | 无码人妻久久一区二区三区蜜桃 | 禁漫天堂免费网站 | 无码人妻精品一区二区三应用大全 | 麻豆av网| 国产精品久久久久久久久晋中 | 在线看黄的网站 | 青春草国产视频 | 超碰在线免费 | 日本亚洲精品 | 日本精品一区视频 | 伊人网色| 99视频精品 | 成人黄色一级视频 | 亚洲va韩国va欧美va精品 | 亚洲一区二区三区综合 | 久久久久久久久久国产精品 | 91香蕉视频污污 | 国内自拍偷拍视频 | 在线a网 | 亚洲色吧 | av一区二区三区 |