3

每次 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 的同一行崩溃......

请救我脱离这一切。

谢谢。

4

2 回答 2

5

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

主文件

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

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

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

折叠堆栈 扩展堆栈

于 2012-07-13T01:56:18.653 回答
2

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

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

于 2012-07-13T01:41:14.747 回答