Xcode 4.x - 使其指向令人讨厌的崩溃线

Spa*_*Dog 3 iphone xcode cocoa cocoa-touch xcode4

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

int retVal = UIApplicationMain(argc, argv, nil, @"AppController");
Run Code Online (Sandbox Code Playgroud)

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

请不要:

  1. 告诉我启用NSZombieEnabled;
  2. 告诉我为Catch或Throw上的所有异常添加一个异常断点来中断.
  3. 告诉我Xcode 4.x优于3.x进行调试.

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

请救救我.

谢谢.

Chr*_*hey 5

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

的main.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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

而且我会添加这个只是因为当我认为我没有可用的信息时它让我好几次,但我还不知道Xcode还不够(我确信这是常识,而我只是愚蠢).有时当我认为我所拥有的是可怕的顶级范围时,我需要做的就是使用左下角的小滑块(在调试会话期间)来查看整个堆栈.由于上面提到的原因,这通常几乎是无用的(它是问题的runloop的另一部分).

折叠堆栈 扩展堆栈