Valgrind确实是强大的工具http://www.cnblogs.com/nicebear/archive/2012/05/05/2485054.html

来源:互联网 发布:小白鞋推荐 知乎 编辑:程序博客网 时间:2024/05/17 22:29

Valgrind确实是强大的工具

Linux程序内存错误调试中,Valgrind确实是强大的工具。其中Memcheck工具用于查内存越界、内存泄漏,Massif工具用于跟踪程序内各函数的内存使用情况,以及Profiler等一系列工具。

最近维护一个程序,总是跑半小时就崩,每次崩的位置都不一样。经查,是该程序狂吃内存,最终导致内存耗尽。用Memcheck查并没有内存泄漏,于是使用Massif工具跟踪内存使用状况,从输出结果中一目了然地发现了问题的原因:代码中有一个地方在循环地创建线程,却没有及时销毁线程,而是把线程的销毁留给了整个进程的退出部分,怪不得光吃内存,却没有内存泄漏。于是很容易地就将这个问题修正了。 

如果Massif报告的内存占用量和top命令显示的内存占用量不一致,就需要加--pages-as-heap=yes参数,这样能底层的跟踪内存,以获得全部内存使用数据。

对内存越界,Memcheck似乎只能检测堆的越界,而不能检测栈的越界。因此,如果你认为程序中有越界错误,但Memcheck没有检测出时,应该是某个数组的size设小了导致的。查看哪个变量的值被不正当改变了,然后用gdb的watch跟踪该变量,通常就可定位到导致越界的代码。

 

Valgrind还可以和gdb配合使用。用法:

valgrind --vgdb=yes --vgdb-error=0 your_prog

然后在另一个shell中用gdb调试your_prog,然后:

(gdb) target remote | vgdb

此时就可以使用continue命令来执行程序了(vgdb不支持run命令),Valgrind一检测到错误,程序就会在gdb中自动停下来供调试。

 

本文并不是一篇Valgrind教程。Valgrind的文档在这里:http://valgrind.org/docs/manual/manual.html。这个文档非常好,结合着例子讲解各工具的用法,很好懂。


0 0
原创粉丝点击