【问题标题】:gdb catch throw and then ignore exceptionsgdb catch throw 然后忽略异常
【发布时间】:2017-03-21 08:33:09
【问题描述】:

我在一个多线程应用程序中发生了崩溃,无论出于何种原因,我都无法在堆栈部分展开之前捕获异常。

所以现在我试图通过连接 gdb 并使用 catch throw 来捕捉它。但是,我得到了许多其他不相关和捕获的异常。我怎么能忽略这些?

我尝试了ignore 1 1000000,但这并不会只忽略当前关注的异常,而是会忽略所有catch throw 异常。

有什么想法可以让我只忽略那个特定的吗?例如可能是文件和行号?

【问题讨论】:

  • 如果你使用 C++11,你必须学习如何使用std::packaged_task,然后从该任务中获取std::future,这会将你的所有异常转发到主线程。您的线程必须是异常安全的,否则它只是一个糟糕的设计。 std::future 优雅地解决了这个问题。

标签: c++ gdb


【解决方案1】:

从 7.9 版开始,gdb 包含了一些便利功能,例如 $_caller_is$_any_caller_is。这些可以用作断点的条件,使其仅在看到某个调用堆栈时停止。

因此,例如,如果您知道引发异常的位置,您可以执行以下操作:

(gdb) catch throw if $_any_caller_is("functionname")

但是,如果您知道 throwing 函数,在我看来,在特定的 throw 处设置断点会更简单。

在某些情况下,另一种选择是按类型过滤异常。此功能自 7.7 版起内置于 catch throw。此表单接受与类型名称匹配的正则表达式:

(gdb) catch throw NameOfType

【讨论】:

    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多