? 本文將給大家介紹,如何使用一個(gè)小的開(kāi)源組件【memwatch】排查有可能出現(xiàn)【內(nèi)存泄漏】的代碼。
先上一段測(cè)試代碼,里面是包括一些內(nèi)存操作錯(cuò)誤的代碼:
//main.c
#include
#include
#include
#include
#include "memwatch.h" //包含memwatch提供的頭文件
static void signal_handler(int sign_no)
{
printf("Capture signal no: %d\n", sign_no);
exit(-1);
}
int memory_leak_test(void)
{
char *p, *p1, *p2=NULL;
p = malloc(100); //申請(qǐng)空間
if (p) {
strcpy(p, "123456");
}
p1 = malloc(5); //申請(qǐng)空間
if (p1) {
strcpy(p1, "123456");
}
//free(p); //使用完故意不釋放
//free(p1); //使用完故意不釋放
*p2 = '5'; //訪問(wèn)空指針,導(dǎo)致segment default (core dump),memwatch并不能堅(jiān)持出來(lái)
return 0;
}
int main(int arc, const char *argv[])
{
signal(SIGSEGV, signal_handler);
printf("This is a sample for memwatch to detect memory leak !!!\n");
memory_leak_test();
return 0;
}
然后將memwatch的源碼memwatch.c和memwatch.h放到main.c的目錄下,一同參與編譯,如下圖:
通過(guò)makefile或其他編譯方式,將上述文件編譯成可執(zhí)行文件,再運(yùn)行,觀察運(yùn)行結(jié)果,如下:
從圖中我們可以知道,memwatch檢測(cè)出了main.c中內(nèi)存操作錯(cuò)誤的地方。另外,除運(yùn)行輸出錯(cuò)誤信息外,還會(huì)生成一個(gè)memwatch.log文件,從中可以詳細(xì)地知道內(nèi)存錯(cuò)誤的類型和具體位置。如下圖:
//memwatch.log
============= MEMWATCH 2.71 Copyright (C) 1992-1999 Johan Lindh =============
Started at Thu Mar 7 09:05:35 2019
Modes: __STDC__ 64-bit mwDWORD==(unsigned int)
mwROUNDALLOC==8 sizeof(mwData)==56 mwDataSize==56
Stopped at Thu Mar 7 09:05:35 2019
unfreed: <2> src/main.c(25), 5 bytes at 0xe667e0 [overflowed] {31 32 33 34 35 .. .. .. .. .. .. .. .. .. .. .. 12345}
unfreed: <1> src/main.c(20), 100 bytes at 0xe66720 {31 32 33 34 35 36 00 FE FE FE FE FE FE FE FE FE 123456..........}
Memory usage statistics (global):
N)umber of allocations made: 2
L)argest memory usage : 105
T)otal of all alloc() calls: 105
U)nfreed bytes totals : 105
這樣我們就可以很清晰地根據(jù)反饋問(wèn)題點(diǎn)修改對(duì)應(yīng)的內(nèi)存操作bug了,是不是很方便實(shí)用呢?
當(dāng)然,這個(gè)范例僅僅是做了比較簡(jiǎn)單的示范,在實(shí)際項(xiàng)目工程中,可能會(huì)遇到更多更隱蔽的內(nèi)存操作問(wèn)題,靈活運(yùn)用memwatch排查內(nèi)存問(wèn)題,定會(huì)事半功倍。
最后附上,整個(gè)測(cè)試工程的文件,包括源碼和makefile,以供參考,如有發(fā)現(xiàn)問(wèn)題,可在留言區(qū)評(píng)論,我會(huì)及時(shí)跟進(jìn)回復(fù)。謝謝。
demo工程下載鏈接:memwatch_for_memory_leak_detect.tar.gz
?審核編輯:湯梓紅
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3025瀏覽量
74055 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68616 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1289瀏覽量
40135
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論