我在运行C ++的ARM处理器上出现SEGFAULT错误的内存问题。
我运行valgrind,它给了我这个信息:
==7298== Thread 6:
==7298== Mismatched free() / delete / delete []
==7298== at 0x482C80C: free (in /usr/lib/valgrind/vgpreload_memcheck-arm-linux.so)
==7298== Address 0x58186d8 is 0 bytes inside a block of size 29 alloc'd
==7298== at 0x482CC94: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-arm-linux.so)
==7298==
我进入gdb并在0x482CC94,0x58186d8和0x482C80C上运行“info symbol”,调试器显示“No symbols matches”。
我在程序中运行了很多线程,我无法弄清楚从哪里开始。我厌倦了将printf置于最可能的线程中,看看是否有帮助,但printf语句和valgrind输出之间似乎没有任何关联。
如何调试此问题?有没有办法在我的代码中命名线程,以便Valgrind可以显示除“线程6”之外的东西。任何指导都将不胜感激。
答案 0 :(得分:0)
可能是在程序启动期间发生了分配/解除分配。试试" - show-under-main"选项:
- show-below-main = [默认:否]
"默认情况下,错误的堆栈跟踪不会显示主要显示在main下面的任何函数,因为大多数情况下它都是不感兴趣的C库内容和/或gobbledygook。或者,如果堆栈跟踪中不存在main,则堆栈跟踪将不会显示类似于类似主函数的任何函数,例如glibc&#39s的__libc_start_main。此外,如果跟踪中存在类似主函数,则将它们标准化为(在主下方),以使输出更具确定性。
如果启用此选项,将显示所有堆栈跟踪条目,并且不会对类似主函数进行规范化。"
您可能还想查看" - read-var-info"
- read-var-info = [默认:否]
启用后,Valgrind将从DWARF3调试信息中读取有关变量类型和位置的信息。这显着降低了Valgrind的启动速度并使其使用了更多的内存,但对于可以利用它的工具(Memcheck,Helgrind,DRD),它可以产生更精确的错误消息。
您可以尝试其他valgrind选项。手册在这里: