【发布时间】:2018-06-25 00:31:41
【问题描述】:
每次 gdb 捕获异常时,我都会遇到一个烦人的错误。 我已经运行了以下示例程序
#include <stdexcept>
int main() {
throw std::invalid_argument("");
return 0;
}
而运行gdb的结果是
terminate called after throwing an instance of 'std::invalid_argument'
what():
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
这并不是那么糟糕,因为我确实得到了我需要的信息,只是让我烦恼......
有人知道如何解决这个问题吗?
【问题讨论】:
-
为您的发行版使用包管理器并搜索该文件?
-
我做到了。它在 gnulib 包中,但在安装后位于 /usr/share/gnulib/lib/raise.c 中。 Gdb 没有找到它。
-
这里没有什么可修复的。即使您获取
raise.c并且能够看到该行发生了什么,这也只是浪费时间,因为它不是您的代码的一部分,实际上导致异常被抛出。 -
我会走另一条路。你不在乎。你不需要raise的源代码。一旦 raise() 被调用,你就知道断言失败或抛出了异常。打印调用堆栈 (
bt) 并移动到适当的框架 (frame n) 以调试您的代码。 -
'它只是在打扰我'不不不......它正在调试你;)