C++ 我如何找出gdb停止的原因

C++ 我如何找出gdb停止的原因,c++,gdb,C++,Gdb,在使用GDB调试程序时,我遇到了程序在调试模式下停止的问题。当我进行回溯时,我发现它位于专有的第三方库调用堆栈中,我希望找出程序停止的确切原因。我仍然只是一个GDB初学者,所以我仍然不确定如何做到这一点。查看回溯时,我注意到“\uuucxa\uthrow()来自/usr/lib64/libstdc++.so.6”,因此我假设抛出了某种类型的异常,但如果可能的话,我想知道如何获取有关它的更多信息。尝试使用回溯命令,该命令将显示您的程序是如何进入当前状态的。你可以找到更多的细节 我如何找出gdb停止

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

尝试使用
回溯
命令,该命令将显示您的程序是如何进入当前状态的。你可以找到更多的细节

我如何找出gdb停止的原因

GDB通常会马上告诉你,例如

Program received signal SIGABRT, Aborted.
0x00007ffff7750425 in __GI_raise (sig=<optimized out>)
程序收到信号SIGABRT,中止。
0x00007FF7750425英寸GI上升(sig=)
程序因收到信号而停止

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

它停止的原因正是GDB告诉你的

查看回溯时,我注意到,/usr/lib64/libstdc++.so.6中的
\ucxa\uthrow(),因此我假设引发了某种异常,但我想知道如何获取有关它的更多信息

出现
\uuucxa\uthrow
表示已抛出异常(出现
std::terminate()
表示该异常是未捕获的异常)

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

  • 您可以阅读此库的文档,并仔细检查是否违反了它所要求的任何先决条件
  • 您可以反汇编名为
    \uuucxa\uthrow
    的例程,并准确地找出调用该例程的原因
gdb“up”命令允许您将焦点转移到调用堆栈的更高级别。如果您移动到代码存在的异常之前的某个点,您可以看到您当时在做什么(并有希望确定您是否调用了数据不正确的函数)。我这样做了,代码中的所有内容看起来都很好(至少根据他们的文档)。我尝试了这一点,然后找到了引发异常的地方,但不是为什么。如果没有“为什么”的答案,我不会感到惊讶,但这里是希望。我通常会跳转到一帧,因为我知道是什么导致了这个问题。您是否能够使用
list
命令在特定帧中查看源代码?您确定正在调试的代码是使用
-ggdb-DFULLDEBUG-O0
选项编译的吗?事实上,我可以自信地说,我拥有的第三方库没有任何调试信息。sigh@Brian:据我所知,查看信息的唯一方法是使用调试标志重新编译库。如何使
gdb
再次告诉我停止消息/原因
程序收到信号SIGABRT,已中止
?我在
“Ctrl+X”、“Ctrl+A”
之间切换,当我回来时,
gdb
与其他人一起丢失了最初的消息。