? 本文將給大家介紹,如何使用一個小的開源組件【memwatch】排查有可能出現(xiàn)【內(nèi)存泄漏】的代碼。
先上一段測試代碼,里面是包括一些內(nèi)存操作錯誤的代碼:
//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'; //訪問空指針,導(dǎo)致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;
}
![poYBAGDYdXCAWkKMAAAAK8RNs4s030.png](https://file.elecfans.com/web2/M00/03/FB/poYBAGDYdXCAWkKMAAAAK8RNs4s030.png)
然后將memwatch的源碼memwatch.c和memwatch.h放到main.c的目錄下,一同參與編譯,如下圖:
![](https://file.elecfans.com//web2/M00/59/22/pYYBAGLkyUaAJCMYAABciHTBFbM177.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6dWxsYw==,size_16,color_FFFFFF,t_70)
通過makefile或其他編譯方式,將上述文件編譯成可執(zhí)行文件,再運(yùn)行,觀察運(yùn)行結(jié)果,如下:
![](https://file.elecfans.com//web2/M00/58/84/poYBAGLkyUeActyzAACfBFu7nNM778.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6dWxsYw==,size_16,color_FFFFFF,t_70)
從圖中我們可以知道,memwatch檢測出了main.c中內(nèi)存操作錯誤的地方。另外,除運(yùn)行輸出錯誤信息外,還會生成一個memwatch.log文件,從中可以詳細(xì)地知道內(nèi)存錯誤的類型和具體位置。如下圖:
//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
![poYBAGDYdXCAWkKMAAAAK8RNs4s030.png](https://file.elecfans.com/web2/M00/03/FB/poYBAGDYdXCAWkKMAAAAK8RNs4s030.png)
這樣我們就可以很清晰地根據(jù)反饋問題點(diǎn)修改對應(yīng)的內(nèi)存操作bug了,是不是很方便實(shí)用呢?
當(dāng)然,這個范例僅僅是做了比較簡單的示范,在實(shí)際項目工程中,可能會遇到更多更隱蔽的內(nèi)存操作問題,靈活運(yùn)用memwatch排查內(nèi)存問題,定會事半功倍。
最后附上,整個測試工程的文件,包括源碼和makefile,以供參考,如有發(fā)現(xiàn)問題,可在留言區(qū)評論,我會及時跟進(jìn)回復(fù)。謝謝。
demo工程下載鏈接:memwatch_for_memory_leak_detect.tar.gz
?審核編輯:湯梓紅
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3064瀏覽量
74382 -
代碼
+關(guān)注
關(guān)注
30文章
4837瀏覽量
69122 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1306瀏覽量
40427
發(fā)布評論請先 登錄
相關(guān)推薦
【RT-Thread學(xué)習(xí)筆記】使用scons命令生成靜態(tài)庫
![【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】使用scons命令生成靜態(tài)庫](https://file.elecfans.com/web2/M00/56/A8/poYBAGLgkRKAdlneAAD3qLF7bAM159.png)
RT-Thread 應(yīng)用筆記 - RTC Alarm 組件的使用
![<b class='flag-5'>RT-Thread</b> 應(yīng)用<b class='flag-5'>筆記</b> - RTC Alarm 組件的使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 理解defunct僵尸線程
![<b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 理解defunct僵尸線程](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 設(shè)備模型rt_device的理解
![<b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 設(shè)備模型<b class='flag-5'>rt</b>_device的理解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對象鏈表結(jié)構(gòu)深入理解
![<b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 內(nèi)核對象鏈表結(jié)構(gòu)深入理解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對象初始化鏈表組織方式
![<b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 內(nèi)核對象初始化鏈表組織方式](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對象操作API
![<b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 內(nèi)核對象操作API](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述
![<b class='flag-5'>RT-Thread</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> <b class='flag-5'>RT-Thread</b>的架構(gòu)概述](https://file.elecfans.com/web2/M00/52/31/pYYBAGLKk5WAA__jAADjdAdXhIs410.jpg)
基于RT-Thread Studio學(xué)習(xí)
![基于<b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>學(xué)習(xí)</b>](https://file1.elecfans.com/web2/M00/82/C1/wKgaomRhn_SAM7fdAACQhFt0KEA325.jpg)
評論