C++ and Valgrind Debugging

C++ and Valgrind Debugging

本文关键字:Debugging Valgrind and C++      更新时间:2023-10-16

我在运行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上运行"信息符号",调试器会说"没有符号匹配"。

程序中运行的线程太多了,我不知道从哪里开始。我很想把printf放在最有可能的线程中,看看这是否有帮助,但printf状态和valgrind输出之间似乎没有任何相关性。

如何调试此问题?有没有办法在我的代码中命名线程,这样Valgrind就可以显示除"线程6"之外的内容。如有任何指导,我们将不胜感激。

可能是在程序启动期间发生了分配/解除分配。尝试"--show below main"选项:

--显示在main下方=[默认:否]

"默认情况下,错误的堆栈跟踪不会显示main下面出现的任何函数,因为大多数时候C库的东西和/或官样文章都不感兴趣。或者,如果堆栈跟踪中不存在main,堆栈跟踪也不会显示类似main的函数(如glibc的__libc_start_main)下面的任何函数。此外,如果跟踪中存在类似main的功能归一化为(主项下),以便使输出更具确定性。

如果启用此选项,则将显示所有堆栈跟踪条目,并且不会对类主函数进行规范化。"

您可能还想查看"--read var info"

--读取var信息=[默认:否]

启用后,Valgrind将从DWARF3调试信息中读取有关变量类型和位置的信息。这大大减慢了Valgrind的启动速度,并使其使用了更多的内存,但对于可以利用它的工具(Memcheck、Helgrind、DRD)来说,它可能会导致更精确的错误消息。

你还可以尝试其他的选择。手册在这里:

http://valgrind.org/docs/manual/manual.html