NSException在调试器中重新抛出错误的堆栈
问题描述:
当我尝试执行某些操作时(例如调用一个不存在或尝试的方法),当我崩溃时(出于我理解的原因;这不是问题)要将nil插入到集合中,调试器会显示从main()到__pthread_kill的堆栈,而不会在实际崩溃代码运行时出现任何帧。有一个叫做objc_exception_rethrow的框架(从main组成的第9个框架)。这导致我相信Cocoa Touch正在尝试做某些事情来恢复所有异常并优雅地死去。但是,调试时无法真正使用Xcode4的调试工具来调查调用堆栈帧,甚至看不到我崩溃的代码中的位置,这是非常令人恼火的。NSException在调试器中重新抛出错误的堆栈
是否有某种方法可以使objc_exception_rethrow行为不发生,并且只要引发异常就会崩溃?也许有一个调试设置,使它更早崩溃(在权利时间)? (我还没有搞乱这个项目中的任何构建设置。)
答
我找到了答案:在Obj-C Exceptions上设置一个断点。它会在objc_exception_throw命中时进入调试器,这很好。不幸的是,这种情况发生在打印异常之前,但是我们可以通过设置断点的动作为(调试器动作)po *(id *)($ebp + 8)
来反正(大部分时间)。
答
我不知道任何Xcode设置可能会禁用重新抛出异常。据我所知,它们是由运行时重新引发的。你可以尝试运行没有附加调试器的应用程序,让它崩溃。崩溃报告应该包含一个“Last Exception Backtrace”部分,该部分将为您准确提供您在这种情况下需要的内容。