我有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
我读到这意味着我的代码访问了一个不允许的无效内存位置。
我的问题:
如何找出哪个缓冲区内存访问无效,以及上述哪些功能已经完成。
如何使用地址 0x1bcaf2f0 ,valgrind说的无效。如何在该地址找到符号(实质上是缓冲区名称)?内存映射文件,任何其他方式。
使用Valgrind检测内存(堆/堆栈损坏)错误的任何其他常规指针,valgrind选项或其他工具?
答案 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