? 本文將給大家介紹,如何使用一個小的開源組件【memwatch】排查有可能出現【內存泄漏】的代碼。
先上一段測試代碼,里面是包括一些內存操作錯誤的代碼:
//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); //申請空間
if (p) {
strcpy(p, "123456");
}
p1 = malloc(5); //申請空間
if (p1) {
strcpy(p1, "123456");
}
//free(p); //使用完故意不釋放
//free(p1); //使用完故意不釋放
*p2 = '5'; //訪問空指針,導致segment default (core dump),memwatch并不能堅持出來
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的目錄下,一同參與編譯,如下圖:
通過makefile或其他編譯方式,將上述文件編譯成可執行文件,再運行,觀察運行結果,如下:
從圖中我們可以知道,memwatch檢測出了main.c中內存操作錯誤的地方。另外,除運行輸出錯誤信息外,還會生成一個memwatch.log文件,從中可以詳細地知道內存錯誤的類型和具體位置。如下圖:
//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
這樣我們就可以很清晰地根據反饋問題點修改對應的內存操作bug了,是不是很方便實用呢?
當然,這個范例僅僅是做了比較簡單的示范,在實際項目工程中,可能會遇到更多更隱蔽的內存操作問題,靈活運用memwatch排查內存問題,定會事半功倍。
最后附上,整個測試工程的文件,包括源碼和makefile,以供參考,如有發現問題,可在留言區評論,我會及時跟進回復。謝謝。
demo工程下載鏈接:memwatch_for_memory_leak_detect.tar.gz
?審核編輯:湯梓紅
-
內存
+關注
關注
8文章
3019瀏覽量
74005 -
代碼
+關注
關注
30文章
4779瀏覽量
68525 -
RT-Thread
+關注
關注
31文章
1285瀏覽量
40085
發布評論請先 登錄
相關推薦
評論