? 本文將給大家介紹,如何使用一個小的開源組件【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
?審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
內存
+關注
關注
9文章
3210瀏覽量
76363 -
代碼
+關注
關注
30文章
4968瀏覽量
73965 -
RT-Thread
+關注
關注
32文章
1614瀏覽量
44875
發布評論請先 登錄
相關推薦
熱點推薦
RT-Thread 應用筆記 - RTC Alarm 組件的使用
RT-Thread 應用筆記 - 不正確使用LOG也會引發hard faultRT-Thread 應用筆記 - RTC Alarm 組件的使用RT-
發表于 01-25 18:18
?10次下載
RT-Thread 內核學習筆記 - 理解defunct僵尸線程
RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
發表于 01-25 18:19
?9次下載
RT-Thread 內核學習筆記 - 設備模型rt_device的理解
RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
發表于 01-25 18:19
?8次下載
RT-Thread 內核學習筆記 - 內核對象鏈表結構深入理解
RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
發表于 01-25 18:23
?6次下載
RT-Thread 內核學習筆記 - 內核對象初始化鏈表組織方式
RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
發表于 01-25 18:24
?3次下載
RT-Thread學習筆記分享
我是從2020年11月初開始學習RT-Thread實時操作系統的,在學習RT-Thread之前,我接觸過uCOS和FreeRTOS,但這兩個在單片機上應用的實時操作系統,我都沒有仔細并
RT-Thread學習筆記 RT-Thread的架構概述
RT-Thread 簡介 作為一名 RTOS 的初學者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會逐漸發現 RT-Thread 的魅力和它相較于其他同類型 RTOS
【RT-Thread學習筆記】用memwatch排除內存泄露
評論