如何找出gdb停止的原因

How do I find out why gdb has stopped

本文关键字:何找出 gdb      更新时间:2023-10-16

在使用GDB调试程序时,我遇到了程序在调试模式下停止的问题。当我进行回溯时,我发现它深入到专有的第三方库调用堆栈中,我正在寻找程序停止的确切原因。我仍然只是一个GDB的初学者,所以我仍然不确定如何做到这一点。查看回溯,我注意到"__cxa_sthrow()from/usr/lib64/libstdc++.so.6",所以我假设抛出了某种异常,但如果可能的话,我想知道如何获得更多信息。

尝试使用backtrace命令,该命令将显示程序是如何进入当前状态的。在这里您可以找到更多详细信息。

如何找出gdb停止的原因

GDB通常会立即告诉您,例如

Program received signal SIGABRT, Aborted.
0x00007ffff7750425 in __GI_raise (sig=<optimized out>)

程序由于收到信号而停止。

我发现它深入到专有的第三方库调用堆栈中,我正在寻找程序停止的确切原因。

由于GDB告诉您的原因,它已完全停止

查看回溯,我注意到__cxa_throw() from /usr/lib64/libstdc++.so.6,所以我假设抛出了某种异常,但我想知道如何获得有关它的更多信息。

__cxa_throw的存在确实表明抛出了异常(std::terminate()的存在表明它是未捕获的异常)。

如果没有第三方库的调试信息,您查找原因的选择是有限的:

  • 您可以阅读此库的文档,并仔细检查您是否违反了它所要求的任何先决条件
  • 您可以分解调用__cxa_throw的例程,并弄清楚调用该例程的确切原因