我遇到了一个奇怪的场景,其中以下不太可能的代码:
try{
throw Core::ValueError();
}
catch (Core::Error &e){
...
}
(ValueError 继承自 Error 继承自 std::exception)
如果编译成可执行文件会导致异常被捕获,但如果编译成特定的共享库则不会。
所以我的问题:
我可以使用哪些调试工具和/或技术来窥探异常处理过程的黑盒?我可以用 gdb 逐步完成它吗?
是否有任何我可以从 Mach-o 标头中提取的信息来告诉我某些 catch 子句对某些异常的可捕获性(如果你愿意的话)?特别是,我可以看看“gcc_except_tab”部分及其可爱的 LSDA、符号表或其他部分,并推断出符号可见性的任何问题或与捕获异常相关的其他问题吗?
我确实找到了一个在线资源,声称使用鸡、七条老鼠尾巴和粒子加速器的解决方案,但我想我会先尝试 StackOverflow,然后将黑魔法作为最后的手段。
(我在 OSX 10.6.7 上运行 i686-apple-darwin10-g++-4.2.1)