如何找到导致 valgrind 崩溃的代码行?

问题描述 投票:0回答:1

我有一个 C++(带有 Qt 6)应用程序,它似乎正常编译运行良好,并且还带有调试信息。但是,当我从 valgrind 运行它时,我收到错误:

17:35:07:进程退出并返回值进程崩溃

并且 valgrind 显示“(错误操作)vgdb me ...”

我尝试使用 Valgrind+GDB 运行,但它停在我的代码之外的一行(仅显示汇编代码,没有 C++ 源代码)。 GDB 在函数 ?? 处停止,回溯中又多了一行 ??,第一行位于地址 0x50ccb9c 处。 valgrind 窗口显示“(错误操作)vgdb me ...”

我已确保安装了最新的 valgrind 和 gdb。我被卡住了......我如何找到导致崩溃的代码行?

c++ crash gdb valgrind
1个回答
0
投票

您需要使用编译标志来获取更多调试信息。

libstdc++ 构建的默认优化和调试标志是 -g -O2。然而,调试和优化标志都可以改变以改变调试特性。例如,通过 -g -O0 -fno-inline 标志关闭所有优化将禁用内联和优化,并添加调试信息,以便可以单步执行所有函数(包括内联构造函数和析构函数)。此外,当需要额外的调试信息(例如嵌套类信息)时,可以使用 -fno-eliminate-unused-debug-types。

来自 gcc.gnu.org

没有

-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
中进行代码布局。

© www.soinside.com 2019 - 2024. All rights reserved.