我有一个 C++(带有 Qt 6)应用程序,它似乎正常编译运行良好,并且还带有调试信息。但是,当我从 valgrind 运行它时,我收到错误:
17:35:07:进程退出并返回值进程崩溃
并且 valgrind 显示“(错误操作)vgdb me ...”
我尝试使用 Valgrind+GDB 运行,但它停在我的代码之外的一行(仅显示汇编代码,没有 C++ 源代码)。 GDB 在函数 ?? 处停止,回溯中又多了一行 ??,第一行位于地址 0x50ccb9c 处。 valgrind 窗口显示“(错误操作)vgdb me ...”
我已确保安装了最新的 valgrind 和 gdb。我被卡住了......我如何找到导致崩溃的代码行?
您需要使用编译标志来获取更多调试信息。
libstdc++ 构建的默认优化和调试标志是 -g -O2。然而,调试和优化标志都可以改变以改变调试特性。例如,通过 -g -O0 -fno-inline 标志关闭所有优化将禁用内联和优化,并添加调试信息,以便可以单步执行所有函数(包括内联构造函数和析构函数)。此外,当需要额外的调试信息(例如嵌套类信息)时,可以使用 -fno-eliminate-unused-debug-types。
没有
-g
标志:
➜ RTFM c++ main.cpp
➜ RTFM valgrind ./a.out
...
==37411== Invalid write of size 1
==37411== at 0x109136: main (in /tmp/a.out)
==37411== Address 0x0 is not stack'd, malloc'd or (recently) free'd
...
[1] 37411 segmentation fault valgrind ./a.out
带有
-g
标志:
➜ RTFM c++ -g main.cpp
➜ RTFM valgrind ./a.out
...
==37705== Invalid write of size 1
==37705== at 0x109136: main (main.cpp:4)
==37705== Address 0x0 is not stack'd, malloc'd or (recently) free'd
...
[1] 37705 segmentation fault valgrind ./a.out
现在我可以看到我的错误是
main.cpp
中的第4行。
这样您还可以在
gdb
中进行代码布局。