0

当我崩溃(出于我理解的原因;这不是问题)当我尝试做一些 Cocoa 不能接受的事情时,例如调用不存在的方法或尝试将 nil 插入集合时,调试器会显示从 main() 到 __pthread_kill 的堆栈,没有任何实际崩溃代码运行时存在的帧。有一个名为 objc_exception_rethrow 的帧(从 main 开始的第 9 个)。这使我相信 Cocoa Touch 正在尝试做某事或其他事情来恢复所有异常并优雅地死去或其他事情。但是,在调试时无法真正使用 Xcode4 的调试工具来调查调用堆栈帧,甚至无法查看我的代码在哪里崩溃,这是非常令人恼火的。

是否有某种方法可以使 objc_exception_rethrow 行为不发生,并在引发异常时立即崩溃?也许有一个调试设置使它更早(在正确的时间)崩溃?(我还没有弄乱这个项目中的任何构建设置。)

4

2 回答 2

0

我不知道任何可以禁用重新抛出异常的 Xcode 设置。据我所知,它们是由运行时重新抛出的。您可以尝试在没有附加调试器的情况下运行应用程序并让它崩溃。崩溃报告应该包含一个“Last Exception Backtrace”部分,它将准确地为您提供在这种情况下所需的内容。

于 2012-01-24T14:05:49.410 回答
0

我找到了答案:在 Obj-C Exceptions 上设置断点。当 objc_exception_throw 被命中时,它将进入调试器,这很好。不幸的是,这发生在打印异常之前,但我们可以通过将断点的操作设置为 (Debugger Action) 来实现(大部分时间)po *(id *)($ebp + 8)

于 2012-01-29T17:10:37.523 回答