衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【RT-Thread學習筆記】用memwatch排除內存泄露

嵌入式物聯網開發 ? 來源:嵌入式物聯網開發 ? 作者:嵌入式物聯網開發 ? 2022-07-30 14:01 ? 次閱讀

? 本文將給大家介紹,如何使用一個小的開源組件【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;
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

然后將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
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

這樣我們就可以很清晰地根據反饋問題點修改對應的內存操作bug了,是不是很方便實用呢?

當然,這個范例僅僅是做了比較簡單的示范,在實際項目工程中,可能會遇到更多更隱蔽的內存操作問題,靈活運用memwatch排查內存問題,定會事半功倍。

最后附上,整個測試工程的文件,包括源碼和makefile,以供參考,如有發現問題,可在留言區評論,我會及時跟進回復。謝謝。

demo工程下載鏈接:memwatch_for_memory_leak_detect.tar.gz

?審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3055

    瀏覽量

    74331
  • 代碼
    +關注

    關注

    30

    文章

    4827

    瀏覽量

    69052
  • RT-Thread
    +關注

    關注

    31

    文章

    1305

    瀏覽量

    40386
收藏 人收藏

    評論

    相關推薦

    RT-Thread學習筆記】使用scons命令生成靜態庫

    RT-Thread學習筆記】如何使用scons 命令中buildlib的生成靜態庫?
    的頭像 發表于 07-27 09:13 ?6191次閱讀
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】使用scons命令生成靜態庫

    RT-Thread學習筆記】RISC-V匯編基礎三大塊知識

    RT-Thread學習筆記】RISC-V匯編基礎的三大塊知識
    的頭像 發表于 07-30 11:01 ?2823次閱讀
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】RISC-V匯編基礎三大塊知識

    RT-Thread Nano入門學習筆記

    RT-Thread Nano入門學習筆記
    發表于 11-26 12:36 ?20次下載
    <b class='flag-5'>RT-Thread</b> Nano入門<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>

    RT-Thread 應用筆記 - RTC Alarm 組件的使用

    RT-Thread 應用筆記 - 不正確使用LOG也會引發hard faultRT-Thread 應用筆記 - RTC Alarm 組件的使用RT-
    發表于 01-25 18:18 ?10次下載
    <b class='flag-5'>RT-Thread</b> 應用<b class='flag-5'>筆記</b> - RTC Alarm 組件的使用

    RT-Thread 內核學習筆記 - 理解defunct僵尸線程

    RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
    發表于 01-25 18:19 ?8次下載
    <b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 理解defunct僵尸線程

    RT-Thread 內核學習筆記 - 設備模型rt_device的理解

    RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
    發表于 01-25 18:19 ?8次下載
    <b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 設備模型<b class='flag-5'>rt</b>_device的理解

    RT-Thread 內核學習筆記 - 內核對象鏈表結構深入理解

    RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
    發表于 01-25 18:23 ?6次下載
    <b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 內核對象鏈表結構深入理解

    RT-Thread 內核學習筆記 - 內核對象初始化鏈表組織方式

    RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
    發表于 01-25 18:24 ?3次下載
    <b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 內核對象初始化鏈表組織方式

    RT-Thread 內核學習筆記 - 內核對象操作API

    RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
    發表于 01-25 18:26 ?7次下載
    <b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 內核對象操作API

    RT-Thread學習筆記 RT-Thread的架構概述

    RT-Thread 簡介 作為一名 RTOS 的初學者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會逐漸發現 RT-Thread 的魅力和它相較于其他同類型 RTOS
    的頭像 發表于 07-09 11:27 ?4611次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b> <b class='flag-5'>RT-Thread</b>的架構概述

    RT-Thread學習筆記】Makefile的FORCE

    RT-Thread學習筆記】十分鐘學會Makefile的FORCE
    的頭像 發表于 07-30 13:55 ?2682次閱讀
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】Makefile的FORCE

    RT-Thread學習筆記】如何抓取終端的網絡報文

    RT-Thread學習筆記】如何抓取終端的網絡報文?
    的頭像 發表于 07-30 13:57 ?2921次閱讀
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】如何抓取終端的網絡報文

    RT-Thread學習筆記】GCC鏈接報錯的排除過程分享

    RT-Thread學習筆記】GCC鏈接報錯的排除過程分享,一個意想不到的問題。
    的頭像 發表于 07-30 15:08 ?1152次閱讀
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】GCC鏈接報錯的<b class='flag-5'>排除</b>過程分享

    RT-Thread文檔_內存管理

    RT-Thread文檔_內存管理
    發表于 02-22 18:30 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>內存</b>管理

    基于RT-Thread Studio學習

    前期準備:從官網下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學習之旅。
    的頭像 發表于 05-15 11:00 ?4129次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>學習</b>
    金宝博百家乐娱乐城| 网上百家乐官网新利| 百家乐赢家公式| 武清区| 百家乐发牌靴发牌盒| 澳门百家乐官网怎赌才能赚钱| 大发888官网官方下载| 肯博百家乐官网的玩法技巧和规则 | 百家乐官网赌博机有鬼吗| 新全讯网2| 百家乐官网技巧开户网址| ican博彩通| 乐天堂百家乐官网娱乐| 皇冠走地| 华侨人百家乐的玩法技巧和规则| 网络百家乐官网的玩法技巧和规则| 固阳县| 大发888优惠代码 官网| 太阳城百家乐红利| 百家乐官网桌布尼布材质| 御匾会娱乐城| 长赢百家乐赌徒| 免费百家乐规则| 至尊百家乐官网贺一航| 大发888游戏平台| 有百家乐的棋牌游戏| 金博士百家乐官网娱乐城| 365体育投注| 巴比伦百家乐的玩法技巧和规则 | 保单百家乐游戏机| 皇冠网百家乐官网赢钱| 顶级赌场官方下载| 百家乐技术辅助软件| 玩百家乐官网技巧巧| 澳门凯旋门娱乐城| 百家乐手论坛48491| 克拉克百家乐下载| 百家乐官网赌博现金网| 百家乐必胜法| 威尼斯人娱乐城官网| 百家乐网上赌博网|