神器valgrind

标签: 工作故事 | 发表时间:2014-02-13 09:07 | 作者:RobinDong
分享到:
出处:http://blog.donghao.org

其实早在2006年我就用过valgrind,但当时valgrind不能观测daemon的内存泄漏问题,所以后来渐渐用得少了。

今天又遇到一个内存泄漏问题,程序颇大,手工调试不太现实了,所以又想到了valgrind,毕竟在这7年间,valgrind又强大了不少。查了一下,它已经可以检测daemon进程了,方法在 这里 对应的官方文档在 这里 其中"monitor leak_check full reachable any"相当于设置gdb的breakpoint。

不过,我要调试的这个程序,一运行就fork了,然后子进程负责主要的逻辑,父进程只是等待子进程返回用的,而且,只在运行某个特殊逻辑时出现内存泄漏,平时的逻辑没有问题。怎么弄?折腾了一下,发现可以搞定:首先,在gdb里运行“set follow-fork-mode child”来自动跟踪子进程,然后,一开始不要急着用”monitor leak_check full reachable any"来检测,先"continue“运行一阵子,当开始跑造成内存泄漏的逻辑时,再ctrl+c打断,再”monitor leak_check full reachable any“设上断点,自然会吐出valgrind的memleak信息。

用这两招,果然找到内存泄漏的点了,隐藏颇深,如果不是用工具,真不知何年何月才能发现。感谢valgrind神器,支持vgdb支持daemon检测,真是杀手级的新特性。(我用的是最新的 valgrind-3.9.0,老的valgrind估计不支持)

另外说明一下,我是gdb的小白,以上招数和解释不见得正确或最优,如有行家肯指点,感激不尽。

相关 [valgrind] 推荐:

神器valgrind

- - 斯巴达第二季
其实早在2006年我就用过valgrind,但当时valgrind不能观测daemon的内存泄漏问题,所以后来渐渐用得少了. 今天又遇到一个内存泄漏问题,程序颇大,手工调试不太现实了,所以又想到了valgrind,毕竟在这7年间,valgrind又强大了不少. 查了一下,它已经可以检测daemon进程了,方法在 这里 对应的官方文档在 这里 其中"monitor leak_check full reachable any"相当于设置gdb的breakpoint.

Valgrind的使用方法

- - CSDN博客研发管理推荐文章
        Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等. Valgrind可以检测内存泄漏和内存违例,还可以分析cache的使用等,灵活轻巧而又强大,能直穿程序错误的心脏,真可谓是程序员的瑞士军刀.

linux实用技巧:检测内存泄漏工具Valgrind

- - CSDN博客系统运维推荐文章
1.Valgrind简介.         1.在我们编写C/C++的时候,最常见的错误之一就是内存泄露,这样的问题其实跟程序员的编程习惯密不可分. 如果你在申请内存空间之后能够马上在合适的位置释放内存. 会极大程度的避免内存泄漏的情况. 有时候我们确实忘记释放内存而导致了比较严重的错误,所以这个时候我们需要借助valgrind这个工具来判断内存泄漏.

内存泄漏检查工具valgrind的安装与使用

- - CSDN博客推荐文章
Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件工具套装. 它最流行的工具是Memcheck, 它能检测C/C++中大部分的内存相关的错误. 程序编译时使用 “-g”参数,以添加调试信息,这样Memcheck的错误消息可以精确到行;. 编译时使用“-O0”也有必要,只是速度会很慢,“-O1”可能会导致Memecheck的错误消息不正确;.

C/C++的内存泄漏检测工具Valgrind memcheck的使用经历(求大神解答疑惑,找出内存泄露真凶)

- - CSDN博客综合推荐文章
Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Linux下用g++编译运行却崩溃了,给出一堆汇编代码也看不懂. 久久不得解过后,想想肯定是内存方面的错误,VS在这方面一般都不检查的,就算你的程序千疮百孔,各种内存泄露、内存管理错误,只要不影响运行,没有读到不该读的东西VS就不会告诉你(应该是VS内部没实现这个内存检测功能),因此用VS写出的程序可能不是完美或健壮的.