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

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

自己寫內(nèi)存泄露檢測(cè)庫(kù)

author: kevin lynx

這個(gè)內(nèi)存泄露工具最基本的原理就是利用宏替換掉標(biāo)準(zhǔn)的malloc、free(暫不考慮其他內(nèi)存分配函數(shù),
如realloc、strdup),記錄下每次內(nèi)存分配和釋放動(dòng)作。因?yàn)楹甑奶幚戆l(fā)生在預(yù)處理階段,所以可以
很容易地用你自己的malloc函數(shù)替換掉標(biāo)準(zhǔn)的malloc。例如:

/* lib.h */
#define malloc my_malloc
#define free my_free 

/* lib.c */
/* disable these macro in this compile unit */
#undef malloc
#undef free 

static int count = 0

void *my_malloc( size_t size )
{
    
++count;
    
return malloc( size );
}
 

void my_free( void *a )
{
    
--count;
    free( a );
}
 


要使用以上代碼,用戶在使用時(shí)就需要包含lib.h,從而可以使用宏將用戶自己寫的malloc替換
為my_mallo。當(dāng)程序退出時(shí),如果count大于0,那么可以肯定的是有內(nèi)存泄露。當(dāng)然,如果
count為負(fù)數(shù),則很可能對(duì)同一個(gè)指針進(jìn)行多次free。

但是以上代碼的功能太局限了。一個(gè)真正的內(nèi)存泄露檢測(cè)庫(kù)(工具),至少需要報(bào)告泄露的代碼
文件、函數(shù)、行數(shù)等信息。當(dāng)然,如果能報(bào)告調(diào)用堆棧,就更好了。不過(guò)這就依賴于具體的平臺(tái),
需要使用特定的系統(tǒng)接口才可以獲取出。

要實(shí)現(xiàn)以上功能也很簡(jiǎn)單,只需要在每次調(diào)用malloc的時(shí)候,通過(guò)編譯器預(yù)定義宏__FILE__、
__LINE__、__FUNCTION__(__func__)就可以得到文件名、函數(shù)、行號(hào)等信息。將這些信息保存
起來(lái),然后在free的時(shí)候移除相應(yīng)的信息即可。

最簡(jiǎn)單的實(shí)現(xiàn)方式,就是保存一個(gè)表,表里記錄著每次分配內(nèi)存的信息:

 

struct memRecord
{
    
char file[MAX_FILE_NAME];
    
char func[MAX_FUNC_NAME];
    size_t lineno;
    
void *address;
    size_t size;
}


struct memRecord mem_record[MAX_RECORD]; 

 

但是,通過(guò)單單一個(gè)free函數(shù)的void*參數(shù),如何獲取出對(duì)應(yīng)的分配記錄呢?難道:

for( size_t i = 0; i < MAX_RECORD; ++ i )
{
    
if( address == mem_record[i].address ) 
    
{
        
/* shit */
    }

}
 

 

雖然可行,但是很stupid。這里提供一個(gè)小技巧:

 

void *my_malloc( size_t size )
{
    
void *= malloc( size + sizeof( size_t ) );
    
return (char*)a + sizeof( size_t );
}
 

void my_free( void *a )
{
    
/* actually, 'a' is not the real address */
    
char *= ((char*)a - sizeof( size_t ) );    
    free( p );
}

 

意思就是說(shuō),我多分配了4字節(jié)內(nèi)存(sizeof( size_t ) ),用于保存這次分配記錄在mem_record
中被保存的索引。在釋放內(nèi)存的時(shí)候,通過(guò)一些地址偏移計(jì)算,就可以獲取出真正的系統(tǒng)malloc
返回的地址,從而安全釋放(別給我說(shuō)這里的計(jì)算存在平臺(tái)和編譯器的限制,沒認(rèn)真看文章的SB才說(shuō))。

另一個(gè)問題是,我們?nèi)绾翁幚砻看畏峙溽尫艜r(shí),對(duì)于分配記錄那個(gè)數(shù)據(jù)結(jié)構(gòu),也就是mem_record。
每一次free的時(shí)候,移除的記錄可能位于mem_record的任何位置。一定時(shí)間后,mem_record內(nèi)部
將出現(xiàn)很多漏洞(已經(jīng)沒用的數(shù)組位置)。解決這個(gè)問題最直接當(dāng)然還是最stupid的方法,就是每次
free移除記錄時(shí)重新整理一遍mem_record。如果你這樣做了,那你的malloc/free比微軟的還慢。

我的解決方法是:
size_t free_index[MAX_RECORD];
用于保存這些出現(xiàn)漏洞的index。每一次free移除記錄時(shí),就把這個(gè)記錄對(duì)應(yīng)的inex保存進(jìn)來(lái),表示
這個(gè)index指向的mem_record[]可用。每一次malloc的時(shí)候,先從這里取index,如果這里沒有,那
可以直接從mem_record的末尾取。

具體細(xì)節(jié)就不闡述了,典型的空間換時(shí)間方法。整個(gè)庫(kù)很簡(jiǎn)單,代碼100來(lái)行。我也只進(jìn)行過(guò)粗略的
測(cè)試。我肯定這100來(lái)行代碼是有問題的,相信自己的代碼存在問題是對(duì)bug的一種覺悟,哈哈哈。

這個(gè)東西只檢測(cè)C語(yǔ)言的內(nèi)存泄露,其實(shí)要檢測(cè)C++的也很簡(jiǎn)單,只需要重載new和delete就可以了。

要放春節(jié)假了,在公司的最后幾個(gè)小時(shí)實(shí)在無(wú)聊,才做了這個(gè)東西,前后花了1個(gè)多小時(shí),寫起來(lái)感覺
不錯(cuò)。

 

 

代碼下載

 

posted on 2009-01-23 17:43 Kevin Lynx 閱讀(4420) 評(píng)論(5)  編輯 收藏 引用 所屬分類: c/c++

評(píng)論

# re: 自己寫內(nèi)存泄露檢測(cè)庫(kù) 2009-01-23 22:53 jims

本人一直博主學(xué)習(xí)  回復(fù)  更多評(píng)論   

# re: 自己寫內(nèi)存泄露檢測(cè)庫(kù) 2009-01-23 23:04 adon

char *str = (char*) malloc( 100 );
char *str2 = (char*) malloc( 111 );
str = str2;
free(str);
free(str);
getchar();

Memory leak report by cmlc, a tiny c memory leak checking library.
Detected 0 memory leaks.

似乎在free上出了點(diǎn)問題  回復(fù)  更多評(píng)論   

# re: 自己寫內(nèi)存泄露檢測(cè)庫(kù) 2009-01-23 23:28 adon

static void cmlc_remove_record( size_t index )
{
if( fi_tail < MAX_RECORD - 1 )
{
free_index[fi_tail++] = index;
free(mem_record[index].address);
mem_record[index].address = 0; /* to identify this record has been removed */
}
}

void cmlc_free( void *address )
{
struct memory *mem = (struct memory*)( (char*)address - sizeof( size_t ) );
cmlc_remove_record( mem->index );
// free( mem ); //注釋的free,移到cmlc_remove_record中
}  回復(fù)  更多評(píng)論   

# re: 自己寫內(nèi)存泄露檢測(cè)庫(kù) 2009-01-23 23:55 萬(wàn)連文

需要考慮多線程,否則太不安全了,沒有實(shí)際意義。  回復(fù)  更多評(píng)論   

# re: 自己寫內(nèi)存泄露檢測(cè)庫(kù) 2009-01-24 20:55 陳梓瀚(vczh)

微軟的編譯器僅需在cpp開始的地方:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

當(dāng)你認(rèn)為東西都是放完了以后調(diào)用
_CrtDumpMemoryLeaks();

東西就回到output窗口去了。  回復(fù)  更多評(píng)論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久久香蕉网| 欧美国产在线电影| 尤物网精品视频| 欧美精品久久久久久久免费观看| 亚洲第一色在线| 一区二区三区国产盗摄| 欧美日韩一区二区三| 午夜久久资源| 久久中文字幕导航| 亚洲靠逼com| 国产精品亚洲欧美| 久久精品国产免费| 亚洲免费观看在线观看| 久久蜜桃香蕉精品一区二区三区| aⅴ色国产欧美| 国内外成人在线| 欧美日韩国产综合新一区| 久久国产直播| 国产精品99久久久久久久久| 欧美成人嫩草网站| 久久高清一区| 亚洲一区尤物| 亚洲二区在线视频| 国产欧美日韩一区二区三区在线 | 麻豆精品传媒视频| 一区二区欧美日韩视频| 欧美1区2区3区| 亚洲五月六月| 亚洲美女视频网| 国产一区二区视频在线观看 | 一区二区三区鲁丝不卡| 免费亚洲电影在线| 性做久久久久久久久| 亚洲国产三级网| 国产亚洲第一区| 国产精品99免视看9| 你懂的网址国产 欧美| 亚洲欧美成人一区二区三区| 欧美韩国在线| 久久夜色精品国产欧美乱| 亚洲欧美中文字幕| 亚洲在线观看| 亚洲欧洲在线播放| 在线观看欧美日韩| 国户精品久久久久久久久久久不卡| 欧美日韩在线另类| 欧美成人按摩| 牛人盗摄一区二区三区视频| 久久久久一区| 久久久之久亚州精品露出| 亚洲淫片在线视频| 宅男噜噜噜66一区二区66| av不卡在线| 一区二区三区国产| 亚洲调教视频在线观看| 一区二区毛片| 99爱精品视频| 一区二区三区四区五区在线| 夜夜夜精品看看| 在线视频亚洲| 香蕉久久精品日日躁夜夜躁| 午夜欧美电影在线观看| 亚洲欧美在线磁力| 欧美一区二区三区另类| 久久精品国产96久久久香蕉| 久久久国产精品一区二区中文 | 亚洲免费在线视频| 亚洲一区二区黄色| 亚洲欧美日韩高清| 小嫩嫩精品导航| 久久国产精品一区二区三区| 久久精品亚洲热| 久久九九电影| 欧美一区二区三区视频| 久久看片网站| 老**午夜毛片一区二区三区| 美女国产一区| 亚洲国产一区二区视频| 亚洲日本一区二区| 亚洲一区二区三区四区在线观看| 先锋影院在线亚洲| 久久人人爽国产| 欧美精品一区二区三区在线播放 | 国模私拍视频一区| 永久免费视频成人| 亚洲裸体在线观看| 亚洲综合色自拍一区| 久久精品亚洲乱码伦伦中文| 久久中文久久字幕| 亚洲国产欧美不卡在线观看| 一区二区成人精品| 午夜日本精品| 久久疯狂做爰流白浆xx| 久久精品亚洲精品| 欧美日韩第一区| 国产欧美精品一区二区三区介绍| 国产欧美一区二区三区沐欲| 亚洲成人自拍视频| 亚洲视频在线观看视频| 久久大逼视频| 亚洲人成在线观看网站高清| 亚洲小少妇裸体bbw| 久久国产精品高清| 欧美日韩综合在线| 狠狠色狠色综合曰曰| 一区二区三区精品视频| 久久精品一区二区三区四区| 欧美高清视频一区| 亚洲午夜小视频| 免费成人黄色av| 国产九色精品成人porny| 亚洲电影成人| 亚洲欧美久久久久一区二区三区| 久久综合给合久久狠狠狠97色69| 亚洲精品国产精品国自产在线| 亚洲综合视频网| 久久精品中文字幕免费mv| 欧美日本不卡高清| 国产日韩高清一区二区三区在线| 亚洲美女av电影| 香蕉av福利精品导航| 欧美成人免费一级人片100| 亚洲一区日韩在线| 欧美阿v一级看视频| 国产欧美日韩精品a在线观看| 亚洲另类自拍| 久久国产精品久久久| 欧美国产免费| 欧美怡红院视频一区二区三区| 美女尤物久久精品| 国内在线观看一区二区三区| 亚洲综合视频在线| 亚洲免费电影在线| 美女视频黄 久久| 伊人久久大香线| 欧美一区网站| 亚洲图片欧洲图片av| 美国十次成人| 国内视频精品| 久久精品一区二区国产| 国产精品99久久99久久久二8| 欧美岛国激情| 亚洲高清免费| 欧美好骚综合网| 久久男女视频| 亚洲承认在线| 欧美18av| 牛牛国产精品| 亚洲精品国产精品乱码不99| 欧美大学生性色视频| 久久精品在线播放| 狠狠色狠狠色综合系列| 欧美在线网站| 亚洲综合999| 国产精品激情偷乱一区二区∴| 在线亚洲+欧美+日本专区| 日韩特黄影片| 欧美视频中文在线看| 国产精品99久久久久久人| 亚洲精品视频一区二区三区| 欧美成人精品h版在线观看| 亚洲成人在线网站| 欧美国产日本高清在线| 欧美.www| 国产精品99久久久久久宅男| 一区二区av在线| 欧美国产精品va在线观看| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲国产精品www| 欧美精品一区二区三区久久久竹菊 | 性欧美精品高清| 亚洲欧美春色| 国产午夜精品理论片a级大结局| 99热这里只有精品8| 99视频一区| 嫩草伊人久久精品少妇av杨幂| 亚洲免费电影在线| 亚洲伦理在线免费看| 欧美日韩国产在线播放| 亚洲综合导航| 欧美一区二区三区视频在线观看 | 欧美成人免费小视频| 欧美黄色aa电影| 亚洲综合首页| 亚洲欧美日韩国产| 国产伦精品一区二区三区在线观看| 亚洲欧美中文另类| 欧美亚洲在线视频| 国产日韩欧美一二三区| 鲁大师成人一区二区三区| 欧美精品激情在线观看| 亚欧美中日韩视频| 久久频这里精品99香蕉| 日韩一区二区电影网| 99国产麻豆精品| 久久美女性网| 国产精品日韩欧美大师| 亚洲第一成人在线| 国产一区二区三区四区在线观看| 亚洲人成免费|