【问题标题】:Xcode 4.x - making it point to the offending crashing lineXcode 4.x - 使其指向有问题的崩溃行
【发布时间】:2012-07-12 20:36:37
【问题描述】:

每次 Xcode 崩溃时,它都会指向 main.m 上的这一行

int retVal = UIApplicationMain(argc, argv, nil, @"AppController");

我知道与 3.x 相比,Xcode 4 调试很臭,但是我如何让它指向发生崩溃的行。

请不要:

  1. 告诉我启用 NSZombieEnabled;
  2. 告诉我添加一个异常断点来中断 Catch 或 Throw 上的所有异常。
  3. 告诉我,Xcode 4.x 比 3.x 更适合调试。

所有这些东西都没用或几乎没用,Xcode 继续在 main.m 的同一行崩溃...

请救救我。

谢谢。

【问题讨论】:

  • 您还可以向 Apple 记录错误并提出功能请求,以便更好地支持此类情况的调试。
  • 我在他们发布 4.x 时已经这样做了。我已经针对 Xcode 4 填写了至少 15 个错误/功能请求,顺便说一句,臭不可闻。

标签: iphone xcode cocoa-touch cocoa xcode4


【解决方案1】:

这里有一个想法:只在整个应用程序中进行一次尝试/捕获,记录堆栈异常,而不是当前堆栈(即不是断点+检查) :

ma​​in.m

int main(int argc, char *argv[])
{
    @autoreleasepool {
        @try {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
        @catch (NSException *exception) {
            NSLog(@"%@",[exception callStackSymbols]);
            return 1;
        }
    }
}

我的理解是,我们没有好的方法的原因是崩溃本身直到运行循环的后期才会发生。我认为诸如未捕获的异常之类的事情只是将应用程序置于一种状态,当 runloop 迭代时,它将在 Apple 代码的某处崩溃。这类似于如果您曾经在 UI 中发生崩溃...当您设置蹩脚的几何图形时它并不总是崩溃,当它尝试使用它时它会崩溃.因此,我们需要从异常对象中获取堆栈,而不是从实际发生崩溃时的当前状态中获取。

我会添加这个只是因为它让我有几次以为我没有可用的信息,但我只是对 Xcode 还不够了解(我相信这是常识,我只是在愚蠢的)。有时,当我认为我所拥有的只是可怕的顶级作用域时,我需要做的就是使用左下角的小滑块(在调试会话期间)来查看整个堆栈。由于上述原因,这通常几乎没有用(它在问题的运行循环的另一部分)。

【讨论】:

  • 谢谢!现在好多了。还不是理想的解决方案,因为理想的解决方案必须来自 Apple,但要好 1000 倍!!!至少现在 Xcode 给出了正在发生的事情的线索。我希望苹果决定在 Xcode 的下一个版本中创建一个像样的调试器。
【解决方案2】:

很明显,您已经完成了研究,并且只得出了相同的答案。这是有原因的;不幸的是,它们真的是我们为 Xcode 4.x 所拥有的一切,所以我们不能给你另一个答案。

我只能建议,如果您已经完成了上述所有修复,并且您正在使用链接的框架或库,那么这些可能是您没有得到崩溃发生的确切线路的核心原因。链接的库已经编译,无法显示崩溃的确切行,但如果您可以大致确定错误发生的位置以及导致错误的库,您可以从问题的根本原因开始归零并且找到违规行。

【讨论】:

  • 谢谢。为什么这些东西只发生在 Xcode 4.x 上?我使用 Xcode 3.x 多年,它运行良好。降级到 Xcode 4 后,问题就出现了。在 Xcode 4.x 上调试是一场噩梦。我正在调试的 10 次崩溃中有 9 次遇到这种情况。
  • 我希望我能告诉你!不幸的是,无论用户反馈如何,Apple(有时)都非常乐意删除或完全更改其产品中的现有功能。至少你并不孤单,我经常盯着所有指向 main.m 运行循环或内存地址的随机十六进制转储的崩溃日志。
  • 是的,你的痛苦是我的! ctrahey 描述的这个方法至少给了你一些线索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多