【问题标题】:App crashing....objc_exception_throw应用程序崩溃....objc_exception_throw
【发布时间】:2024-05-01 22:45:02
【问题描述】:

我的应用程序在某一时刻不断崩溃。它没有告诉我为什么,异常断点发生在

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

所以我不知道是什么导致了崩溃。在左侧,它告诉我这是因为 objc_expcetion_throw。我该如何调试呢? 谢谢

【问题讨论】:

  • 尝试调试它,直到它进入这一行。 Xcode 4.2 存在直接在 main.m 行中给出异常的问题。没有它,没有人可以帮助你。并发布更多代码。
  • 如果你在没有设置断点的情况下运行应用程序,它应该在日志中放置一个堆栈跟踪和一个原因。

标签: objective-c ios xcode cocoa-touch


【解决方案1】:

在这种情况下,我将创建一个中断所有异常的断点。如果您只需单击断点选项卡上的添加按钮,就会创建默认断点。

有了这个断点,XCode 将在异常点停止,我可以看到发生异常的那行代码以及堆栈。

我会发布一张这样的图片,但我没有足够的代表!

【讨论】:

    【解决方案2】:

    使用@try / @catch

    @try {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
    @catch (NSException *ex)
    {
        // log ex...
    }
    

    或者您可以使用未捕获的异常处理程序:

    void uncaughtException(NSException *except)
    {
        // log Except
        NSLog(@"Exception!");
    }
    
    NSSetUncaughtExceptionHandler(uncaughtException);
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    

    最后,你总是可以打破 objc 异常:

    Product->debug->create symbolic breakpoint
    Symbol: objc_exception_throw
    

    【讨论】:

    • 不起作用。仍然没有日志,并且断点在同一个旧位置:(
    • @PragmaOnce 检查我的更新答案,使用 2 种新的调试方法!
    【解决方案3】:

    遵循 Richard 的建议并实施 uncaughtException 处理程序。在处理程序中设置断点。当异常触发时,在输出控制台中输入:

    po [except callStackSymbols]
    

    这应该会为您提供有关异常来源的更多详细信息。

    注意:except 是您使用的异常变量的名称。

    【讨论】: