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



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

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

我得到这个作为瓦尔格林德的输出消息之一:

==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,瓦尔格林德说这是无效的。如何在该地址找到符号(本质上是缓冲区名称)?内存映射文件,任何其他方式。

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

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

广告 2:尝试将其拆分为多个更简单的行,以防它太复杂且不清楚导致警告的确切调用。

广告3:memcheck是典型的valgrind工具,用于检测堆内存的错误。不过,这对堆栈损坏没有帮助。

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

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

相关内容

  • 没有找到相关文章

最新更新