如何调试以未处理的异常终止的程序?

时间:2009-11-24 10:28:38

标签: c++ linux exception

我在Linux平台上用C ++编程。

我的程序以此(未处理的)异常终止:

“抛出'long'实例后调用终止” 中止

抛出异常的代码在try-catch块内,那为什么会发生这种情况? 从函数返回时抛出异常。

我习惯于C编程,并且在C ++方面经验很少(这是主要问题)。我不知道如何调试这个问题。我不期望一个解决方案,而是一个方向/指针来调试这个问题。

提前致谢。

5 个答案:

答案 0 :(得分:8)

您可以在gdb下运行您的应用程序(使用-g使用调试信息构建它)并在使用该命令抛出异常时使其中断:

(gdb) catch throw

这将带您到异常的起源。此问题还提供了更多信息:

请注意,抛出序数类型(例如long)有点不寻常。它可能在某些临时代码中,因此可以快速找到它。

答案 1 :(得分:5)

调用堆栈中的任何位置都有exception specificationhere?如果有,那么你可能会遇到这个问题 - 你可能想要删除所有这些问题。

如果您使用的是gcc,那么您可以在main()中首先添加此代码:

#ifdef __GNUC__
    std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
#endif // ifdef __GNUC__

http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt02ch06s02.html更多细节)
这将为您提供更好的回溯。

答案 2 :(得分:1)

你可能正在捕捉错误的异常类型

使用

catch(long)

catch(...)

答案 3 :(得分:1)

通常情况下,我建议在抛出类型的构造函数中设置一个断点 - 但在这种情况下......我必须承认从来没有经历过某人已经抛出了很长时间

throw 42;

这在我看来很奇怪。某些调试器可能会在抛出异常时捕获异常。

被叫函数是你的吗?

答案 4 :(得分:1)

使用set_terminate打破GDB

set_terminate()的示例是here

触发时 - 在GDB中使用bt命令查看回溯