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

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

自己寫內存泄露檢測庫

author: kevin lynx

這個內存泄露工具最基本的原理就是利用宏替換掉標準的malloc、free(暫不考慮其他內存分配函數,
如realloc、strdup),記錄下每次內存分配和釋放動作。因為宏的處理發生在預處理階段,所以可以
很容易地用你自己的malloc函數替換掉標準的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 );
}
 


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

但是以上代碼的功能太局限了。一個真正的內存泄露檢測庫(工具),至少需要報告泄露的代碼
文件、函數、行數等信息。當然,如果能報告調用堆棧,就更好了。不過這就依賴于具體的平臺,
需要使用特定的系統接口才可以獲取出。

要實現以上功能也很簡單,只需要在每次調用malloc的時候,通過編譯器預定義宏__FILE__、
__LINE__、__FUNCTION__(__func__)就可以得到文件名、函數、行號等信息。將這些信息保存
起來,然后在free的時候移除相應的信息即可。

最簡單的實現方式,就是保存一個表,表里記錄著每次分配內存的信息:

 

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]; 

 

但是,通過單單一個free函數的void*參數,如何獲取出對應的分配記錄呢?難道:

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

}
 

 

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

 

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 );
}

 

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

另一個問題是,我們如何處理每次分配釋放時,對于分配記錄那個數據結構,也就是mem_record。
每一次free的時候,移除的記錄可能位于mem_record的任何位置。一定時間后,mem_record內部
將出現很多漏洞(已經沒用的數組位置)。解決這個問題最直接當然還是最stupid的方法,就是每次
free移除記錄時重新整理一遍mem_record。如果你這樣做了,那你的malloc/free比微軟的還慢。

我的解決方法是:
size_t free_index[MAX_RECORD];
用于保存這些出現漏洞的index。每一次free移除記錄時,就把這個記錄對應的inex保存進來,表示
這個index指向的mem_record[]可用。每一次malloc的時候,先從這里取index,如果這里沒有,那
可以直接從mem_record的末尾取。

具體細節就不闡述了,典型的空間換時間方法。整個庫很簡單,代碼100來行。我也只進行過粗略的
測試。我肯定這100來行代碼是有問題的,相信自己的代碼存在問題是對bug的一種覺悟,哈哈哈。

這個東西只檢測C語言的內存泄露,其實要檢測C++的也很簡單,只需要重載new和delete就可以了。

要放春節假了,在公司的最后幾個小時實在無聊,才做了這個東西,前后花了1個多小時,寫起來感覺
不錯。

 

 

代碼下載

 

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

評論

# re: 自己寫內存泄露檢測庫 2009-01-23 22:53 jims

本人一直博主學習  回復  更多評論   

# re: 自己寫內存泄露檢測庫 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上出了點問題  回復  更多評論   

# re: 自己寫內存泄露檢測庫 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中
}  回復  更多評論   

# re: 自己寫內存泄露檢測庫 2009-01-23 23:55 萬連文

需要考慮多線程,否則太不安全了,沒有實際意義。  回復  更多評論   

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

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

當你認為東西都是放完了以后調用
_CrtDumpMemoryLeaks();

東西就回到output窗口去了。  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲成人在线网站| 亚洲精品乱码久久久久久日本蜜臀 | 一区二区三区在线看| 亚洲永久视频| 夜夜嗨av一区二区三区免费区| 久久另类ts人妖一区二区| 国产欧美综合在线| 午夜伦欧美伦电影理论片| 99视频超级精品| 欧美不卡视频一区发布| 亚洲国产成人久久| 欧美不卡一区| 美女脱光内衣内裤视频久久网站| 韩国一区二区三区在线观看 | 久久久久久久久一区二区| 中文av一区二区| 欧美日韩不卡| 一区二区欧美国产| 99精品欧美一区二区三区| 欧美另类久久久品 | 在线一区二区三区四区| 欧美日韩精品二区第二页| 在线视频精品| 一区二区黄色| 国产嫩草影院久久久久| 欧美在线观看天堂一区二区三区| 亚洲永久免费观看| 国内综合精品午夜久久资源| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久视频一区| 99精品国产热久久91蜜凸| 一区二区日韩伦理片| 国产日本欧美一区二区三区在线 | 欧美一级淫片aaaaaaa视频| 亚洲永久在线| 在线日韩中文| 亚洲毛片在线观看.| 国产欧美日韩免费| 女生裸体视频一区二区三区| 欧美精品免费播放| 欧美一区二区三区四区在线| 久久久久久一区二区三区| 一区二区三区福利| 欧美影院精品一区| 亚洲精品久久在线| 欧美一区二区三区男人的天堂| 亚洲欧洲精品天堂一级| 一本色道久久加勒比88综合| 国产欧美日韩精品专区| 亚洲大片在线观看| 一个色综合av| 亚洲卡通欧美制服中文| 中文在线资源观看网站视频免费不卡 | 亚洲激精日韩激精欧美精品| av不卡在线观看| 国产在线播精品第三| 亚洲日本一区二区三区| 国产一区二区成人| 9l国产精品久久久久麻豆| 在线成人小视频| 亚洲一区二区三区高清| 亚洲品质自拍| 久久99在线观看| 亚洲午夜羞羞片| 美女尤物久久精品| 久久精品国产亚洲一区二区| 欧美久久久久| 欧美护士18xxxxhd| 国产一区二区三区在线播放免费观看| 亚洲国产欧美在线| 韩日在线一区| 午夜视频精品| 亚洲欧美日韩天堂一区二区| 欧美xxx在线观看| 久热这里只精品99re8久| 国产精品热久久久久夜色精品三区| 91久久夜色精品国产网站| 亚洲国产精品www| 久久精品中文字幕免费mv| 久久精品二区亚洲w码| 国产精品久久久久久久久借妻| 亚洲福利精品| 亚洲高清一二三区| 久久综合给合| 狼人天天伊人久久| 狠狠色丁香久久综合频道 | 欧美日韩亚洲激情| 亚洲国产精品视频一区| 亚洲国产美女久久久久| 久久久久99精品国产片| 久久夜色精品国产欧美乱| 国产亚洲欧洲一区高清在线观看| 亚洲一区二区视频| 欧美一区=区| 国产欧美1区2区3区| 亚洲一区一卡| 久久精品30| 国产亚洲精久久久久久| 欧美在线视频免费| 久久综合久久久久88| 一区三区视频| 欧美高清成人| 99香蕉国产精品偷在线观看| 午夜精品国产更新| 国产亚洲精品bt天堂精选| 欧美午夜在线视频| 亚洲国产美女精品久久久久∴| 一区视频在线| 欧美本精品男人aⅴ天堂| 亚洲欧洲中文日韩久久av乱码| 亚洲日本va午夜在线影院| 欧美黄色免费网站| 日韩一级免费| 欧美日一区二区在线观看 | 久久国产精品毛片| 久久精品视频在线播放| 国产一区二区精品| 免费在线亚洲| 9l视频自拍蝌蚪9l视频成人 | 在线精品视频免费观看| 欧美mv日韩mv国产网站app| 亚洲国产美女| 欧美日韩三级| 午夜欧美精品久久久久久久| 麻豆成人在线播放| 在线视频你懂得一区| 国产婷婷色综合av蜜臀av| 久久偷窥视频| 亚洲成色www久久网站| 在线不卡中文字幕播放| 久久中文字幕一区| 在线电影欧美日韩一区二区私密| 久久久久久久波多野高潮日日| 亚洲国产成人精品久久久国产成人一区 | 一区二区三区**美女毛片| 亚洲美女区一区| 亚洲欧洲av一区二区三区久久| 国产一区二区高清视频| 欧美jjzz| 午夜精品久久久久久久白皮肤| 欧美顶级少妇做爰| 亚洲欧美一级二级三级| 在线精品观看| 国产精品网站一区| 亚洲国产精品毛片| 欧美一区二区网站| 一区二区精品在线| 亚洲国产高清在线| 国产酒店精品激情| 欧美激情第二页| 久久精品国产2020观看福利| 99亚洲一区二区| 亚洲大胆av| 久久一区激情| 中日韩高清电影网| 影音先锋亚洲一区| 国产精品久久久久国产精品日日| 免费不卡视频| 久久久久久久一区| 午夜精品久久久久| 99热免费精品在线观看| 欧美国产专区| 欧美在线播放一区| 国产精品美女久久久久av超清 | 欧美激情视频在线播放| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美一区二区在线播放| 亚洲欧美日韩一区二区三区在线| 亚洲人成7777| 国内成+人亚洲+欧美+综合在线| 国产精品久久久久99| 欧美日韩爆操| 欧美日韩精品久久久| 欧美xx视频| 亚洲黄色精品| 18成人免费观看视频| 免费成年人欧美视频| 小嫩嫩精品导航| 一区二区在线不卡| 国内成+人亚洲+欧美+综合在线| 欧美日韩国产影片| 亚洲免费一在线| 亚洲午夜精品一区二区三区他趣| 亚洲精品欧美专区| 亚洲精品一线二线三线无人区| 亚洲成色777777女色窝| 亚洲国产99精品国自产| 最新日韩在线视频| 在线观看亚洲a| 狠狠色丁香婷婷综合影院| 激情婷婷久久| 樱花yy私人影院亚洲| 精品二区视频| 亚洲精品视频一区二区三区| 亚洲精选在线| 亚洲欧美成人精品| 午夜精品短视频| 久久精品亚洲一区二区| 免费在线国产精品| 亚洲精选中文字幕|