堆栈跟踪或更多信息在Xcode / iPhone中未处理的exception

请原谅我的无知,但是在iPhone模拟器中运行iPhone应用程序时,一直在困扰着Xcodedebugging器。

有时候,当我在Interface Builder中搞砸了一些东西的时候,我在运行时会得到一个未处理的exception,然后我就回到Xcode。 我看到的唯一的一行是“未捕获的exception”或类似的东西。 从我所看到的,没有额外的信息,更不用说堆栈跟踪或其他有用的东西了。

在过去的十年里,我一直在使用Visual Studio进行开发,而且我习惯于在出现这种情况时获得一个很好的堆栈跟踪和完整的exception信息。

我敢肯定,我只是失去了一些非常明显的东西…希望…

如果添加两个断点,则应该能够debugging这些exception。 要做到这一点,去运行| 显示| 断点并创build两个全局断点(我在全局做这些断点,因为它们在我的所有应用程序中非常有用)。 第一个应该命名为“objc_exception_throw”,其位置应该是“libobjc.A.dylib”。 第二个应该是“ – [NSException raise]”,它的位置应该是“CoreFoundation”。

现在,如果您启用了断点debugging应用程序,则应该抛出这些exception。 然后,您应该能够看到在debugging器中导致exception的事件链。

缺less堆栈跟踪通常表示LLDB (debugging器)存在问题。 我喜欢LLDB,但是当涉及到在iOS应用程序中显示堆栈跟踪和突破exception而不是主要时,这是一个痛苦的屁股,现在已经有几个版本。 不知道为什么苹果还没有解决这个问题呢。 要解决这个问题有两个步骤:

  1. 编辑你当前的scheme,并在“运行”选项卡下将debugging器从LLDB更改为GDB。
  2. https://developer.apple.com/bugreporter/并报告错误,以便苹果解决它。;

嘿activa – 有关运行时exception的更多信息,您应该能够打开debugging器控制台并查看更多信息。 我假设你已经这样做了,但为了以防万一 – 你可以通过从菜单中select运行 – >控制台来实现。 我不知道为什么它不会自动出现!

你可以把你的UIApplicationMain包装在try / catch中:

int main(int argc, char *argv[]) { int retVal; NSAutoreleasePool * pool; @try { pool = [[NSAutoreleasePool alloc] init]; retVal = UIApplicationMain(argc, argv, nil, nil); } @catch(NSException* e) { NSLog(@"%@", e.reason); } @finally { [pool release]; } return retVal; } 

在debugging时,您还应该查找设置断言处理程序: NSAssertionHandler 。

更新:还有未处理的exception处理程序: NSSetUncaughtExceptionHandler