如何在linux下检测内存泄漏

如何在linux下检测内存泄漏,第1张

是不是说没有一种内存检查工具能够在linux使用呢,也不是,像valgrind工具还是相当不错的。他的下载地址是 下载一个valgrind 3.2.3 (tar.bz2) 工具,按照里面的README提示,安装后就可以使用这个工具来检测内存泄露和内存越界等。这是一个没有界面的内存检测工具,安装后,输入valgrind ls -l 验证一下该工具是否工作正常(这是README里面的方法,实际上是验证一下对ls -l命令的内存检测),如果你看到一堆的信息说明你的工具可以使用了。 在编译你的程序时,请设置-g参数,编译出后使用如下的命令来判断你的程序存在内存泄露: valgrind --tools=memcheck --leak-check=full yourProg在输出信息中就会看到你的内存问题了。

1. 在需要内存泄漏检查的代码的开始调用void mtrace(void) (在mcheck.h中? 有声明). mtrace为malloc等函数安装hook, 用于记录内存分配信息.在需要内存泄漏检查的代码的结束调用void muntrace(void).\x0d\x0a注意: 一般情况下不要调用muntrace, 而让程序自然结束. 因为可能有些释放内存代码要到muntrace之后才运行.\x0d\x0a\x0d\x0a2. 用debug模式编译被检查代码(-g或-ggdb)\x0d\x0a\x0d\x0a3. 设置环境变量MALLOC_TRACE为一文件名, 这一文件将存有内存分配信息.\x0d\x0a\x0d\x0a4. 运行被检查程序, 直至结束或muntrace被调用.\x0d\x0a\x0d\x0a5. 用mtrace命令解析内存分配Log文件($MALLOC_TRACE)\x0d\x0a(mtrace foo $MALLOC_TRACE, where foo is the executible name)\x0d\x0a如果有内存泄漏, mtrace会输出分配泄漏\x0d\x0a内存的代码位置,以及分配数量.\x0d\x0a\x0d\x0a附加说明\x0d\x0a1. 可以将mtrace, muntrace放入信号处理函数(USR1, USR2), 以动态地进行内存泄漏检查控制.\x0d\x0a2. mtrace是个perl代码, 如果你对符号地址与代码文本的转换感兴趣, 可以读一下.\x0d\x0a3. again, 尽量不要用muntrace()\x0d\x0aFor C++ Leak:\x0d\x0a检查内存泄漏的方法除glibc提供外;还可以试试一些专用的程序。\x0d\x0a很奇怪,redhat 9 居然不带mtrace perl脚本,只好下载gcc源码编译了\x0d\x0awget --passive-ftp ftp://rpmfind.net/linux/redhat/9 ... -2.3.2-11.9.src.rpm\x0d\x0arpm -ivh glibc*.src.rpm\x0d\x0acd /usr/src/redhat/SPECS/\x0d\x0arpmbuild -ba glibc-9.spec\x0d\x0acd /var/tmp/glibc-2.3.2-root/usr/bin/\x0d\x0acp mtrace /usr/bin/\x0d\x0a调试方法如下:\x0d\x0avi a.c\x0d\x0a1 #include\x0d\x0a2\x0d\x0a3 int main()\x0d\x0a4 {\x0d\x0a5 mtrace()\x0d\x0a6 malloc(10)\x0d\x0a7 malloc(16)\x0d\x0a8 return 0\x0d\x0a9 }\x0d\x0a$gcc -g a.c #记得编译带-g调试选项\x0d\x0a$export MALLOC_TRACE=a.log\x0d\x0a$./a.out\x0d\x0a$unset MALLOC_TRACE #记得执行完后unset变量,否则可能运行其他命令可能覆盖log\x0d\x0a$mtrace a.out a.log\x0d\x0aMemory not freed:\x0d\x0a-----------------\x0d\x0aAddress Size Caller\x0d\x0a0x09b08378 0xa at /XXX/a.c:6\x0d\x0a0x09b08388 0x10 at /XXX/a.c:7\x0d\x0a可以看到,会显示未释放动态空间的代码具体位置。

1、阅读源代码及分析动态内存的使用

由于之前没有做过类似的问题(纯属小白了,惨遭鄙视....),所以就想着通过自己去看代码,查找里面涉及到使用动态内存的代码段去定位问题(现在想想,真是太幼稚了,大家见笑了...),但是自己还是去通过对源代码跟踪、分析,主要是对动态分配的内存(如malloc函数分配的内存)、一些文件描述符等进行跟踪,分析在程序逻辑中对动态分配的内存有没有手动进行释放,打开的文件描述符有没有关闭等这些代码一点点的去分析,当然这也是熟悉代码,了解的一个过程。

2、利用memwatch内存检测工具对程序进行内存分析

Memwatch是一款C语言的内存检测工具。memwatch使用它自己定义的功能函数取代所有在你的程序中用ANSI C定义的内存分配函数,memwatch的内存分配函数包含了所有的分配记录信息。memwatch功能默认不是开启的,除非定义了MEMWATCH,否则在代码中不会跟踪相关的内存使用情况。memwatch通常将它的数据写入到memwatch.log文件中,它也可以被重定向.更多Linux *** 作知识,可以百度《Linux就该这么学》。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8970870.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存