【问题标题】:Uncaught exception - debugging techniques (C++)未捕获的异常 - 调试技术 (C++)
【发布时间】:2011-09-02 23:11:21
【问题描述】:

我遇到了一个奇怪的场景,其中出现了以下不太可能的代码:

try{
  throw Core::ValueError();
}
catch (Core::Error &e){
  ...
}

(ValueError 继承自 Error 继承自 std::exception)

如果编译成可执行文件会导致异常被捕获,但如果编译成特定的共享库则不会。

所以我的问题:

  1. 我可以使用哪些调试工具和/或技术来窥探异常处理过程的黑盒?我可以用 gdb 逐步完成它吗?

  2. 我是否可以从 Mach-o 标头中提取任何信息来告诉我某些 catch 子句对某些异常的可捕获性(如果您愿意的话)?特别是,我可以看看“gcc_except_tab”部分及其可爱的 LSDA、符号表或其他部分,并推断出符号可见性的任何问题或与捕获异常相关的其他问题吗?

我确实找到了一个在线资源,声称使用一只鸡、七条老鼠尾巴和一个粒子加速器的解决方案,但我想我会先尝试 StackOverflow,然后将黑魔法作为最后的手段。

(我在 OSX 10.6.7 上运行 i686-apple-darwin10-g++-4.2.1)

【问题讨论】:

  • 发布一个完整的、最小的示例来演示该问题。我尝试将该代码编译为共享库,并按预期捕获了异常。
  • 是的,我通过简单的重建尝试得到了相同的结果(异常被捕获)。所以现在我有一个有效的简单示例,一个无效的复杂示例,但没有比较它们的工具。我开始从原始代码中修改部分内容,以便在复制问题的同时将其最小化,但我仍在处理黑匣子 - 我想了解更多信息。

标签: c++ debugging exception-handling gdb mach-o


【解决方案1】:

你正在扔一个临时对象,所以你应该catch( Core::Error const& e )

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 2014-06-03
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多