在Xcode / iPhone中堆栈跟踪或更多关于未处理异常的信息

时间:2009-07-07 18:30:52

标签: iphone xcode

请原谅我的无知,但在iPhone模拟器中运行iPhone应用程序时,有些事情一直困扰着Xcode调试器。

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

在过去十年左右的时间里,我一直在使用Visual Studio进行开发,而且我习惯于获得一个很好的堆栈跟踪并在发生类似情况时完成异常信息。

我确信我只是遗漏了一些非常明显的东西......希望......

4 个答案:

答案 0 :(得分:71)

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

现在,如果您在启用断点的情况下开始调试应用程序,它应该在抛出这些异常时中断。然后,您应该能够在调试器中看到导致异常的事件链。

答案 1 :(得分:3)

缺少堆栈跟踪通常表示LLDB(调试器)出现问题。我喜欢LLDB,但是当谈到显示堆栈跟踪并打破异常而不是主要的iOS应用程序时,它是一个痛苦的屁股,现在已经有几个版本。不知道苹果为什么还没有解决这个问题。修复它需要两个步骤:

  1. 编辑您当前的方案,并在“运行”选项卡下将调试器从LLDB更改为GDB。
  2. 转到https://developer.apple.com/bugreporter/并报告错误,以便Apple解决此问题。

答案 2 :(得分:2)

嘿激活 - 有关运行时异常的更多信息,您应该能够打开调试器控制台并查看更多信息。我假设你已经这样做了,但为了以防万一 - 你可以通过选择Run - >来实现它。菜单中的控制台。我不确定为什么它不会自动出现!

答案 3 :(得分:1)

您可以将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;
}

您还应该在调试时查看设置断言处理程序:NSAssertionHandler

更新: 以及未处理的异常处理程序:NSSetUncaughtExceptionHandler