如何根据Valgrind输出进一步调试

时间:2012-05-04 17:07:06

标签: c++ c heap valgrind memory-corruption

我有C / C ++代码,它提供了段错误。它是在RH Linux Enterprise服务器上使用gcc / g ++编译的。我在可执行文件上使用了Valgrind内存检查器:

valgrind --tool=memcheck --leak-check=full --show-reachable=yes

我将此作为Valgrind的输出消息之一:

==7053== Invalid read of size 1
==7053==    at 0xDBC96C: func1 (file1:4742)
==7053==    by 0xDB8769: func2 (file1.c:3478)
==7053==    by 0xDB167E: func3 (file1.c:2032)
==7053==    by 0xDB0378: func4 (file1.c:1542)
==7053==    by 0xDB97D8: func5 (file1.c:3697)
==7053==    by 0xDB17A7: func6 (file1.c:2120)
==7053==    by 0xDBD55E: func7 (file2.c:271) 

==7053==  Address 0x1bcaf2f0 is not stack'd, malloc'd or (recently) free'd 

我读到这意味着我的代码访问了一个不允许的无效内存位置。

我的问题:

  1. 如何找出哪个缓冲区内存访问无效,以及上述哪些功能已经完成。

  2. 如何使用地址 0x1bcaf2f0 ,valgrind说的无效。如何在该地址找到符号(实质上是缓冲区名称)?内存映射文件,任何其他方式。

  3. 使用Valgrind检测内存(堆/堆栈损坏)错误的任何其他常规指针,valgrind选项或其他工具?

2 个答案:

答案 0 :(得分:3)

广告1:在您的示例中,这是行file1:4742(1)中的func1。以下函数是堆栈跟踪。分析该行应该会导致无效的内存访问。

广告2:尝试将其分成多个更简单的行,以防它过于复杂且不明显,哪个确切的调用会导致警告。

Ad 3:memcheck是用于检测堆内存错误的典型valgrind工具。但它对堆栈损坏没有帮助。

答案 1 :(得分:0)

如果您有Valgrind 3.7.0,则可以使用嵌入式gdbserver 使用gdb调试你的应用程序在Valgrind下运行。

请参阅http://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserver