【问题标题】:how can i make my xcode stacktrace readable again?我怎样才能让我的 xcode stacktrace 再次可读?
【发布时间】:2011-10-25 08:11:28
【问题描述】:

我在调试我的 xcode 项目时遇到问题。 当我的应用程序崩溃时,我会得到一个无法读取的堆栈跟踪,如下所示:

2011-10-25 10:03:29.966 fruehstueck[2541:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x352918bf 0x303ce1e5 0x351e620f 0x2c381 0x46f6d 0x3138f7ff 0x3139bc39 0x3139baa9 0x3139b98f 0x3139b211 0x3139af53 0x3138f673 0x3138f349 0x3a347 0x3aa87 0x351eb435 0x3147473f 0x3137050f 0x3136ff01 0x313564ed 0x31355d2d 0x3717be13 0x35265553 0x352654f5 0x35264343 0x351e74dd 0x351e73a5 0x3717afed 0x31384743 0x2e01 0x2dc0)

代码本身并没有在我的源代码中停止,而是在接收到 SIGBART 信号的“int retVal = ...”行中。

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

谁能告诉我是否可以取回我用过的堆栈跟踪,至少我可以在哪里查找我的应用程序在哪一行崩溃了?

提前谢谢, 特立独行

【问题讨论】:

    标签: iphone objective-c xcode ipad


    【解决方案1】:

    它相当简单:

    -[__NSArrayM insertObject:atIndex:]: object cannot be nil
    

    如果你想追踪它并且你知道步骤,那么猜测哪个“insertObject”调用被赋予了一个 nil 指针不会花费太长时间。

    为了获得正确的堆栈跟踪,您是否尝试过清理构建?另外,尝试打开断点。 (并确保您使用的不是 XCode 测试版)。

    【讨论】:

    • “XCode 的调试版本”是什么意思?
    • 对不起,我的意思是“测试版”。编辑了答案。
    • 嗯,断点的问题是,这个错误是随机发生的。我在视图控制器之间切换,并且在切换应用程序崩溃后。但是我没有收到内存警告,所以我真的不知道为什么它在前 5 次有效,而在第 6 次崩溃。我没有使用 XCode 的测试版。我现在会尝试一个干净的构建,但我的希望很低。
    • 这不是一个真正有用的评论。告诉人们“猜测”实际上并没有那么有帮助。他正在寻找的是如何让 Xcode 符号化堆栈跟踪。看起来实际的错误消息(甚至这个实际错误)与询问如何使堆栈跟踪可读的问题无关。
    【解决方案2】:

    您没有将应用委托分配给 UIApplicationMain。这是故意的吗?

    如果不是,并且如果您使用 Xcode 4.2 和 iOS5 SDK,您的 main 必须如下所示:

    int main(int argc, char *argv[])
    {
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }
    

    【讨论】:

    • 该项目是作为 xcode 4.0 下的 ios 4 项目启动的。我只是使用了我公司一直使用的模板。我的 main 看起来像你写的那样有什么原因吗?
    • 当您使用 Xcode 4.2 和 iOS5 SDK 时,您可以使用自动引用计数 (ARC) 功能。来自 Apple 的网站:“Objective-C 的自动引用计数 (ARC) 使内存管理成为编译器的工作。通过使用新的 Apple LLVM 编译器启用 ARC,您将永远不需要再次键入保留或释放,从而大大简化了开发过程,同时减少崩溃和内存泄漏。编译器对您的对象有全面的了解,并在每个不再使用的对象立即释放它,因此应用程序运行速度与以往一样快,性能可预测且流畅。”
    • 好的,但我不需要为此重构整个项目吗?
    • 我认为不会,但最好备份并尝试使用此选项。
    • 如果我使用 ARC,我不会向下兼容 ios 3.2,对吧? AFAIK。我至少必须重构我所有的@synthesize 语句。也许我应该在之前阅读更多关于 ARC 的内容。
    【解决方案3】:

    据我所见,您实际上无法再对调用堆栈进行符号化,但您可以解决此问题。如果您不介意更改应用程序代码或使用 Xcode 窗口的 Debug Navigator 中的图形调用堆栈,请查看 this 答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2014-12-05
      • 2020-11-28
      相关资源
      最近更新 更多