【问题标题】:How to debug a program that is terminating in an unhandled exception?如何调试以未处理异常终止的程序?
【发布时间】:2009-11-24 10:28:38
【问题描述】:

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

我的程序以这个(未处理的???)异常终止:

"在抛出 'long' 的实例后调用终止" 中止

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

我习惯于 C 编程,对 C++ 的经验很少(这是主要问题)。我不知道如何调试这个问题。我不期待解决方案,而是调试此问题的方向/指针。

提前致谢。

【问题讨论】:

  • 既然你在评论中提到你正在使用catch(...),这应该可以工作,你能给我们一些代码吗?
  • 如果您编辑问题并添加表现出这种行为的代码,我们将能够为您提供更多帮助。

标签: c++ linux exception


【解决方案1】:

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

(gdb) catch throw

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

请注意,抛出序数类型(例如long)有些不寻常。它可能在一些临时代码中,所以四处寻找可能会很快找到它。

【讨论】:

    【解决方案2】:

    它在调用堆栈上的任何地方都有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
    这将为您提供更好的此类异常回溯。

    【讨论】:

      【解决方案3】:

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

      使用

      catch(long)
      

      catch(...)
      

      【讨论】:

        【解决方案4】:

        通常,我会建议在抛出类型的构造函数中设置断点——但在这种情况下......我必须承认,我从未经历过有人抛出过长的喜欢

        throw 42;
        

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

        被调用的函数是你的吗?

        【讨论】:

        • throw 42 很酷——尽管它不应该在代码审查中幸存下来。但仍然 - 很酷。
        • 这就是原因,有史以来最大的计算机需要 750 万年的时间来计算它;-) 只是因为一些无知的代码审查者取消了这条线......
        • 42 不是很长,而是一个整数。 :)
        • 对,我很久没用C++编程了;-)
        【解决方案5】:

        使用 set_terminate 打破 GDB

        set_terminate() 的示例是 here

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-08
          • 1970-01-01
          • 2017-08-13
          • 2013-06-01
          相关资源
          最近更新 更多