内存泄露检查函数_mtrace()

一文解析-通过实例讲解 Linux 内存泄漏检测方法 ./test 指的是我们执行的程序名字,[0x400624] 是第一次调用 malloc 函数机器码中的地址信息,+ 表示申请内存( - 表示释放),0x21ed450 是 malloc 函数申请到的地址信息,0x64 表示的是申请的内存大小。和 gprof 类似的分析工具,但它对程序的运行观察更是入微,能给我们提供更多的信息。最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc() / free() / new / delete 的调用都会被捕获。 阅读详情
C语言中一个malloc调用与一个free调用对应出现。
当项目足够大的时候,我们就很容易忘记free内存,或者重复free内存。
在一般Linux发行版中,有一些自带的内存检查工具可以帮助我们去检查对手动分配的内存的free情况,其中的一个工具就是mtrace。
使用mtrace之前需要在C源码中使用GNU C函数mtrace追踪记录内存的分配释放情况。
mtrace()包含在头文件mcheck.h中,与之配对的函数是muntrace(),函数原型分别为:
#include <mcheck.h>
void mtrace(void);

void muntrace(void);


调用mtrace追踪前需要设置环境变量MALLOC_TRACE,可以使用export命令也可以使用setenv函数:

export: export MALLOC_TRACE="<LogName>"

或者:

setenv: assert(!setevn("MALLOC_TRACE", "<LogName>", 1));
其中<LogName>是log文件名,用来保存mtrace生成的追踪记录。
事例中将使用export命令方法。


使用mtrace追踪内存申请与释放的流程:([]表示可选项,可有可无)

1:export MALLOC_TRACE="<LogName>"
2:在C源码中加入mtrace();
3:gcc -g <SourceFile> [-o DestinationBin]
4:执行程序
5:mtrace [DestinationBin] <LogName>


事例:

1:设置环境变量
export MALLOC_TRACE=mcheck.log

export可以指定log的路径,也可以不指定,则生成的log文件在保存在程序执行的目录下。


2:源码
//FileName: mcheck.c
#include <mcheck.h>
#include <malloc.h>
int main()                 
{
    mtrace(); //调用mtrace()函数打开追踪
    char *M1 = malloc(10); //申请10(0xa)字节内存
    char *M2 = malloc(15); //申请15(0xf)字节内存
    //free(M1); //不释放M1内存
    free(M2); //释放M2内存
    return 0;

}


3:编译

gcc -g -o mcheck mcheck.c


4:执行程序


5:mtrace mcheck mcheck.log

执行完程序后,会在程序执行的当前目录下生成一个名为mcheck.log的文件,文件内容:
= Start
@ ./mcheck:[0x804844a] + 0x9780378 0xa
@ ./mcheck:[0x8048456] + 0x9780388 0xf
@ ./mcheck:[0x804845e] - 0x9780388
里面保存了申请内存的超始地址和内存大小,比如0x9780378是M1指向的起始地址,0xa(10)内存大小,而前面的"+"号表示申请内存,"-"表示释放内存。
从上面可以看出程序释放了起始地址为0x9780388的空间,但0x9780378开始的内存空间没有进行释放的记录。从0xa和0xf可以看出0x9780378是M1所指向的空间而0x9780388是M2所指向的空间,从代码可看出程序对M2的空间进行的释放而没有对M1的内存空间进行释放。因此检查结果符合实际情况。

上面的例程很短,可以直接从log文件中直接看出问题所在。但是如果程序足够大,我们就很难去查找问题,因此我们可以使用工具mtrace去分析log文件。

执行第5步时会在终端下输出:
Memory not freed:
-----------------
   Address     Size     Caller
0x09780378      0xa  at /home/fyl/TestPro/mcheck.c:9


从输出的第1行就可以发现了例程没有free内存,而没有释放的内存空间起始地址是:0x09780378,内存空间大小:0xa,调用的地方:mcheck.c的第9行。
于是我们就可以根据实际需求去释放内容,从而避免在程序运行时出现内存泄漏。

如果我们执行第5步时没有加上相应的程序名,而是这样执行:mtrace mtrace.log,就会输出以下信息:
Memory not freed:
-----------------
   Address     Size     Caller
0x09780378      0xa  at 0x804844a
比较一下,就会发现caller列变成了一个地址,而不是源文件所在的位置。
为了能你上面的caller那样可以显示出申请内存的操作在源文件中的位置,在编译程序时需要添加gcc选项-g。

前面说到与mtrace调用相匹配的调用是muntrace,至于使用时候调用起muntrace看自身情况需求。但是一般情况下可以在源文件最后添加,也可以不显式调用它,而是由程序自行结束时关闭mtrace。
因为申请过的内存,有可能不是马上释放的,如果调用了muntrace就有可能检查不正确。



将源代码修改一下:
//FileName: mcheck.c
#include <mcheck.h>
#include <malloc.h>
int main()                 
{
    mtrace(); //调用mtrace()函数打开追踪
    char *M1 = malloc(10); //申请10(0xa)字节内存
    char *M2 = malloc(15); //申请15(0xf)字节内存
    free(M1); //不释放M1内存
    free(M2); //释放M2内存
//M2 = NULL; //不置NULL
free(M2); //第2次释放M2内存
    return 0;
}
如果不添加mtrace()调用,则上面例程会报出:
*** glibc detected *** ./mcheck: double free or corruption (fasttop): 0x099de018 ***
======= Backtrace: =========
/lib/libc.so.6[0xc85c81]
/lib/libc.so.6[0xc885c2]
./mcheck[0x8048445]
/lib/libc.so.6(__libc_start_main+0xe6)[0xc2bd36]
./mcheck[0x8048361]
======= Memory map: ========
0027a000-0027b000 r-xp 00000000 00:00 0          [vdso]
00b54000-00b71000 r-xp 00000000 fd:00 2760424    /lib/libgcc_s-4.4.7-20120601.so.1
00b71000-00b72000 rw-p 0001d000 fd:00 2760424    /lib/libgcc_s-4.4.7-20120601.so.1
00bf3000-00c11000 r-xp 00000000 fd:00 2760408    /lib/ld-2.12.so
00c11000-00c12000 r--p 0001d000 fd:00 2760408    /lib/ld-2.12.so
00c12000-00c13000 rw-p 0001e000 fd:00 2760408    /lib/ld-2.12.so
00c15000-00da5000 r-xp 00000000 fd:00 2760409    /lib/libc-2.12.so
00da5000-00da6000 ---p 00190000 fd:00 2760409    /lib/libc-2.12.so
00da6000-00da8000 r--p 00190000 fd:00 2760409    /lib/libc-2.12.so
00da8000-00da9000 rw-p 00192000 fd:00 2760409    /lib/libc-2.12.so
00da9000-00dac000 rw-p 00000000 00:00 0 
08048000-08049000 r-xp 00000000 fd:02 524499     /home/fyl/TestPro/mcheck
08049000-0804a000 rw-p 00000000 fd:02 524499     /home/fyl/TestPro/mcheck
099de000-099ff000 rw-p 00000000 00:00 0          [heap]
b7600000-b7621000 rw-p 00000000 00:00 0 
b7621000-b7700000 ---p 00000000 00:00 0 
b7731000-b7732000 rw-p 00000000 00:00 0 
b7743000-b7745000 rw-p 00000000 00:00 0 
bfb78000-bfb8d000 rw-p 00000000 00:00 0          [stack]
已放弃 (core dumped)

如果添加了mtrace(),程序只报
*** glibc detected *** ./mcheck: double free or corruption (fasttop): 0x09dbc388 ***
之后就卡住了,至少在机子上测试时是这样。
因此在释放内存后需要将指针置NULL,因为free(NULL)是没问题的。
但是如果人人都注意到些问题,那么也就既不会忘记free,也不会多次free了,更不需要测试了。
因此,mtrace没办法检查下去,就需要使用其他方法了。
内存泄漏定位工具之 mtrace(一) mtrace(memory trace),是 GNU Glibc 自带的内存问题检测工具,它可以用来协助定位内存泄露问题。它的实现源码在glibc源码的malloc目录下,其基本设计原理为设计一个函数 void mtrace (),函数对 libc 库中的 malloc/free 等函数的调用进行追踪,由此来检测内存是否存在泄漏的情况。 阅读详情

相关推荐

【Linux 系统调试】内存管理调试工具mtrace使用方法

在 Linux 嵌入式产品开发中,内存泄漏和不正确的内存管理是常见的问题。mtrace 是 GNU C 库的一部分,专门用于跟踪动态分配的内存,帮助开发者发现内存泄漏和其他与内存相关的错误。本文将详细介绍如何使用 mtrace 进行内存管理调试,并通过示例说明每个要点。mtrace 是一个内置在 glibc 中的工具,可以用来记录所有的mallocrealloc和free调用。它生成的日志文件可以帮助开发者追踪内存分配和释放的过程,从而更容易地发现内存泄漏或非法内存访问的问题。特性mtrace。

以实战经验介绍行业知识 1102

内存泄露专题(4)mtrace内存追踪

等内存申请释放的调用处,插入自己的一些代码,用来记录内存的信息,包括指针的地址,内存块的大小等。的内存信息,其中包含有内存申请的地址,内存申请的大小,释放内存的地址,释放内存的大小。内存并没有释放,所以这段程序是会内存泄漏的。行,它告诉我们下面这些内存是没有被释放的,其次可以看到从第。系统内核自带的一个内存追踪的函数,它会在每个内存申请函数。工具集中的一个,所以如果系统没有该命令的话,可以使用。的位置记录下信息,并在每个内存释放的位置记录下。函数取消内存使用记录。大小的内存没有被释放,这个大小,转成。

禹鼎侯的博客 2923

使用mtrace检查内存泄漏

程序中出现了严重内存泄漏。虽然程序不大,但靠review代码排错很困难,而且个人的所知有限,有些代码错误认识不到。 通过使用mtrace工具,排查出了问题。记录如下:

数字人生 892

mtrace 详解

mtrace 详解

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 1484

从0到1搭建StarRocks3.4.1存算一体架构(VM 虚拟机版)

本文详细介绍了如何在VM虚拟机上从零搭建StarRocks 3.4.1存算一体架构。首先阐述了StarRocks作为高性能分布式SQL数据仓库的优势,重点讲解了其存算一体架构的设计原理。随后提供完整的安装指南,包括环境准备(3台CentOS 8虚拟机配置)、网络互通验证、Java环境配置、软件包解压安装等关键步骤。文章特别详细说明了FE和BE节点的配置文件修改(fe.conf和be.conf)以及必要的防火墙端口开放配置。通过图文并茂的方式,帮助开发者和运维人员快速掌握StarRocks集群部署方法,为后续

小 tom的博客 1329

Java 处理地理信息数据[DEM TIF文件数据获取高程]

EPSG 是一个国际标准,用于唯一标识地理坐标系和投影坐标系。

两点 1278

#内存泄露# #mtrace# mtrace

linux 提供mtrace/muntrace来检测程序是否有内存泄露。一般来说要检测哪一段代码是否有内存泄露,就可以用这一对函数包起来。mtrace每一对malloc-free的执行,若每一个malloc都有相应的free,则代表没有内存泄露,对于任何非malloc/free情況下所发生的内存泄露问题,mtrace并不能找出来。也就是对于new的内存,只能检测出有泄露,但不能定位。因此可能不适用...

潇汀 1万+

FPGA工程师必看:JESD204B同步机制实战指南(含SYSREF信号调试技巧)

本文为FPGA工程师提供了一份JESD204B同步机制的实战指南,重点聚焦于SYSREF信号的调试技巧。文章从同步的核心逻辑出发,深入剖析了时钟、SYSREF与对齐序列这“三驾马车”的协作,并详细阐述了硬件PCB布局、FPGA IP核配置、状态机监控以及使用示波器进行波形分析等关键实战步骤,旨在帮助工程师解决多通道高速系统中的同步难题,确保链路的稳定与确定性延迟。

weixin_29239661的博客 332

mtrace检查内存泄露

mtrace内存泄漏检测: 1.安装mtrace命令: yum install glibc-utils 2.代码: #include <stdio.h> #include <string.h> #include <stdlib.h> /* mtrace 头文件 */ #include <mcheck.h> int main(int argc, char *argv[]) {      /* 设置环境变量, mtrace保存位置 */ set

weixin_46708094的博客 475

面向高速Serdes的信号完整性优化:从封装 - 板级互连局限到封装内互连技术演进(一)

本文针对高速SerDes互连链路中的关键电磁效应展开研究:1)揭示了封装-主板互连结构在毫米波频段易激发谐振效应,导致53GHz传输陷波和阻抗偏移;2)提出基于本征模分析的谐振抑制方法,通过优化接地过孔排布使带宽突破95GHz;3)系统比较了方形/六边形BGA排布下23种差分对朝向的串扰特性,证实六边形阵列可将功率和串扰降低30%以上;4)论证了100GHz以上带宽需采用封装内互连架构,其较传统方案减少50%阻抗不连续节点。

小孟同学的博客 231

【异常】Claude Code CLI 模型调用异常 There‘s an issue with the selected model (claude-sonnet-4-6). It may not

摘要: Claude Code CLI v2.1.45版本存在适配缺陷,导致调用claude-sonnet-4-6模型时触发"模型不存在"的误报错误(跨Windows/Linux平台)。该问题为版本回归类异常,非模型或账户权限问题。解决方案包括:1) 校验模型名称格式为claude-sonnet-4-6;2) 降级至v2.1.34或等待官方修复;3) 检查API配置有效性;4) 通过CLI交互界面手动选择模型;5) 临时切换同系列可用模型。官方已确认该bug并将发布修复版本。

奶爸的编程之路,也就一周冷个三天 6385

linux c 内存泄露检查 mtrace() 笔记

$ man mtrace 只可以用与检查 malloc  NAME        mtrace, muntrace - malloc debugging SYNOPSIS        #include        void mtrace(void);        void muntrace(void); DESCRIPTION      

1596

学习笔记:TF卡启动荔枝派Nano(全志F1C200S)

荔枝派Nano编译Kernel报错报错内容如下编译烧录 报错内容如下 No controllers found No ethernet found. 从这些报错我真没看从出啥问题,也是在网上找,说是没有找到flash,是因为淘宝买的板子更换了flash,需要在u-boot里面重新适配型号: 板子的型号为xt25f128,但是实际u-boot的配置里面不是需要重新更改: u-boot/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts &spi0 { pin

热爱科技,物联,程序开发等 2133

在linux下使用mtrace工具检查内存泄露

在linux下使用mtrace工具检查内存泄露。

头像是我的偶像的专栏 736

Modbus测试工具ModbusPoll与Modbus Slave使用方法 小白实操记录

Modbus 下面介绍modbus标准协议从站、主站仿真工具;可用于指令下发,数据采集等;是学习、现场运维的好工具。 1 介绍 Modbus Poll :Modbus主机仿真器,用于测试和调试Modbus从设备。该软件支持ModbusRTU、ASCII、TCP/IP。用来帮助开发人员测试Modbus从设备,或者其它Modbus协议的测试和仿真。它支持多文档接口,即,可以同时监视多个从设备/数据域。每个窗口简单地设定从设备ID,功能,地址,大小和轮询间隔。你可以从任意一个窗口读写寄存器和线圈。如果你想改

码灵的博客 1万+

OsgEarth开发笔记(三):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(下)

上一篇编译了proj6.2.0、gdal3.2.1,本篇继续。 OsgEarth的编译,是基于Osg和OsgEarth结合在一起的,先要编译Osg,然后编译OsgEarth。OsgEarth的依赖库较多,分为上、中、下三篇,然后单独有一篇如何将编译好的osgEarth集成到Qt中。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

linux下检查内存泄露的工具--mtrace

原文地址:http://blog.youkuaiyun.com/sunnydogzhou/article/details/6532436 最令linux程序员头疼的莫过于内存泄露了,即使你是在优秀的程序员,你也不能保证所以的malloc操作都有对应的free,那必要的工具就是必不可少的了。在一般的linux发行版中,有一个自带的工具可以很方便的替你完成这些事,这个工具就是mtrace。  

yang_chen_shi_wo的博客 783

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

利用mtrace检查内存泄漏

 大家都知道,内存泄漏是每一个程序员和公司最关注的问题。因为此问题可以说是一个定时炸弹且不容易发现。在华为等一些著名的软件公司都十分注意和关心这个问题。一次在听华为一个驱动组的主管的讲座时,他多次的有意识的提到了这个问题,也再次证明了越是经验丰富的老开发人员越关心内存这块雷区,但我们最常去的地方恰恰也就是这块雷区了。最近可能是我们主管在参加什么翻译国外技术书籍(不知道他是否要出书呢,唉

虫子专栏 1281

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

mtrace使用

mtrace 使用介绍 一旦发现系统有这个 “苗头”,当务之急就是要找到代码里哪里忘记归还了动态分配的内存。 而 “内存分配跟踪(malloc tracing)” 机制则是帮助我们检查 “内存泄露” 的好帮手,本文就来给大家介绍一下这个工具的使用,习惯上这个工具我们简称为 mtrace,下文也直接用 mtrace 指称这个工具。 mtrace 工具的主要思路是在我们的调用内存分配和释放的函数中装载 “钩子(hook)” 函数,通过 “钩子(hook)” 函数打印的日志来帮助我们分析对内存的使用是否存在问题。

xl715的博客 3627

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Linux下几款C++程序中的内存泄露检查工具

Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++。最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识。所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用工具来检测内存泄露的情況

OSKernelLAB(gatieme) 6万+

在Linux下检查内存泄露

1.什么是内存泄露? 内存泄露指的是应用程序在分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 2.造成内存泄露的原因是什么? 一般情况下造成内存泄露的主要原因是,由于程序设计的不合理,未对动态申请的堆空间进行回收,或者只在程序的部分出口对申请的内存空间进行回受,从而导致被某个程序弃用却不能被其他程序使用的内存越来越多。 3.内存泄露带来的危害: 内存

weixin_36343850的博客 1万+

linux查内存泄露,linux下如何检查内存泄露

linux下如何检查内存泄露 (16页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.90 积分Linux下如何检查内存泄露,什么是内存泄露?,以下说法哪个正确? 应用程序在分配某段内存后,由于程序使用错误造成物理内存的缺失 应用程序在分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费,什么是内存泄露?,指的是堆内存的泄露,...

weixin_29062865的博客 822

C++内存泄露检查工具

  Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++。最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识。 所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用工具来检测内存泄露的情況,包括: 参见 http://...

ttomqq的专栏 9349

linux 编程----内存泄露检测之mtrace

几种常用的内存检测工具 mtrace是一个C函數,在里声明及定义,函数原型为:  void mtrace(void); 其实mtrace是类似malloc_hook的 malloc handler,只不过mtrace的handler function已由系统为你写好,但既然如此,系统又怎么知道你想将malloc/free的记录写在哪里呢?为此,调用mtrace()前要先设置 MALLOC_T

奔跑的蜗牛 1万+
上一篇: Linux环境变量PS1_命令行提示符设置
fyl_csdn
博客等级 码龄12年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值