博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Linux C动态内存泄漏追踪方法
阅读量:7131 次
发布时间:2019-06-28

本文共 1239 字,大约阅读时间需要 4 分钟。

原文:http://www.cnblogs.com/san-fu-su/p/5737984.html

 

C里面没有垃圾回收机制,有时候你申请了动态内存却忘记释放,这就尴尬了(你的程序扮演了强盗角色,有借有还才是好孩子)。当你想找出内存泄露的地方时,有的投入海量的代码中,头痛不已。还好GNU C库提供了些简单的方法。

  mtrace和muntrace两个函数可以帮助我们追踪动态内存使用情况。前提是我们设置了MALLOC_TRACE环境变量,改环境变量需要指向我们系统下的一个可写入的常规文件。做法如下:

MALLOC_TRACE=/your/path/to/file.txtexport MALLOC_TRACE

  mtrace会为malloc,remalloc和free安装一些特殊的handlers。这些函数的使用情况都会被记录在文件中。

  muntrace会卸载之前安装的特殊handlers。也就意味着动态内存追踪结束。

  一般情况下我们在main函数开头部分调用mtrace,return之前调用muntrace。

  这两个的函数原型在下面给出

#include
void mtrace(void)void muntrace(void)

  使用实例:

#include
#include
int main(int argc, char *argv[]){ #ifdef DEBUG mtrace(); #endif int *a = NULL a = malloc(sizeof(int)); //在这里我们不调用free函数 return 0; }

  在上面的代码中,我们没有调用muntrace(),也不推荐使用。原因是在linux C中不仅是你的程序会追踪动态内存问题,C库也会使用。如果你调用muntrace(),那就意味着C库停止追踪动态内存。

  如果你使用宏定义DEBUG编译文件,执行编译后的可执行文件,你会发现file.txt里面有些我们看不懂的东西。这些内容是给机器看的。大多数linux发行版本都带有mtrace命令(没错,名字一样的)。使用mtrace命令将机读内容转化为人读。使用如下命令:

mtrace a.out file.txt

上述代码执行该命令后的结果如下

Memory not freed:-----------------------    Address        Size            Caller0x092a6378    0x4    at     /root/tmp.c:9

很显然第9行的malloc函数,我们没有调用相应的free()函数来释放内存。

转载于:https://www.cnblogs.com/orlion/p/5739856.html

你可能感兴趣的文章
web3j的maven插件
查看>>
帮你理清React的生命周期
查看>>
堆和堆排序
查看>>
新手也能看懂,消息队列其实很简单
查看>>
全网稀缺的快应用开源项目-熊宝儿歌故事QuickApp
查看>>
【大数据实践】KSQL流处理——如何将多个STREAM输出到一个TOPIC
查看>>
Vue组件通信的几种方式
查看>>
09.Java数据算法
查看>>
git日常使用经验总结
查看>>
ELF文件解析(一):Segment和Section
查看>>
一个由于Function.name造成的兼容性bug
查看>>
比特币钱包隔离认证开发指南
查看>>
《从0到1学习Flink》—— Data Sink 介绍
查看>>
Vue.js 渲染简写样式存在的问题
查看>>
cocos2d-x (js-binding)游戏开发解决方案设计稿
查看>>
改善Python程序的91个建议
查看>>
简单说说 angular.json 文件
查看>>
js-数据运算
查看>>
解决阿里云ECS运行前后台分离项目调用QQ互联导致: redirect uri is illegal(100010)问题...
查看>>
Slog48_项目上线之域名的备案
查看>>