如何调试一个因未处理异常而终止的程序?

3
我正在Linux平台上使用C++编程。
我的程序以这个(未处理???)异常终止:
“terminate called after throwing an instance of 'long'” Aborted
抛出异常的代码位于try-catch块内,为什么会发生这种情况?异常是在从函数返回时抛出的。
我习惯于C编程,在C++方面经验很少(这是主要问题)。我不知道如何调试此问题。我不希望得到解决方案,而是需要一个调试此问题的方向/指针。
先感谢您。

既然你在评论中提到你正在使用 catch(...),而这应该是能够正常工作的,那么您可以展示一些代码吗? - Thomas
1
如果您编辑您的问题并添加展示此行为的代码,我们将更能够帮助您。 - Glen
5个回答

10

你可以在-g编译选项构建时以gdb模式运行你的应用程序,并使用以下命令使它在抛出异常时中断:

(gdb) catch throw

这将带您到异常的来源。有关更多信息,请参见此问题:

请注意,抛出序数类型(如long)有些不寻常。这可能在某些临时代码中,因此通过 grep 可能很快找到。


5

请问调用堆栈中是否有带有异常说明在此处?如果有,则您可能会遇到这个问题-您可能想要删除所有这些。

如果您正在使用gcc,则可以首先添加此代码main()

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

(更多详细信息请参见http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt02ch06s02.html)此举将使得从此类异常中获得更好的回溯。

1

你可能捕获了错误的异常类型

使用

catch(long)

或者

catch(...)

1
通常情况下,我会建议在抛出类型的构造函数中设置断点 - 但在这种情况下...我必须承认从未遇到过有人抛出长整型。
throw 42;

这对我来说很奇怪。有些调试器可能能够在抛出异常时捕获它。

被调用的函数是你自己的吗?


1
抛出42很酷 - 尽管它不应该通过代码审查。但仍然很酷。 - Tobias Langner
1
这就是为什么最大的计算机需要7.5百万年才能计算出来的原因;-)只是因为一些无知的代码审查员删除了那一行... - Juergen
1
42不是长整型,而是整型。 :) - unwind
没错,我已经很久没有用C++编程了;-) - Juergen

1
使用set_terminate来中断GDB set_terminate()的示例在这里 当它被触发时,在GDB中使用bt命令查看回溯。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接