【问题标题】:How do I find out what exception was thrown in the Xcode debugger (for iPhone)?如何找出 Xcode 调试器(适用于 iPhone)中引发的异常?
【发布时间】:2008-12-21 18:31:44
【问题描述】:

我正在从 Erica Sadun 的 The iPhone Developer's Cookbook 学习 iPhone 编程。当我在模拟器中按照从第 81 页开始的温度转换示例中的步骤运行我创建的应用程序时,它由于未捕获的异常而终止。 (请参阅http://groups.google.com/group/iphonesdk/browse_frm/thread/6f44a90fdb8da28a?hl=en 了解我发布到 iPhoneSDK Google 组的问题。)

从我的 main() 调用 UIApplicationMain() 后抛出异常。如果我查看调试器中的堆栈跟踪,我看到的只是(当然)汇编。如何找出引发了什么样的异常?

更新
从调试器控制台了解异常的详细信息足以帮助我解决问题。 (请参阅http://groups.google.com/group/iphonesdk/browse_frm/thread/6f44a90fdb8da28a?hl=en。)我确认我可以在objc_exception_throw 上设置一个符号断点,但我并没有看那里的回溯是否会有所帮助。

【问题讨论】:

    标签: iphone xcode debugging exception


    【解决方案1】:

    objc_exception_throw 处设置断点并通过调试而不是运行运行您的应用

    澄清一下,当你得到一个没有断点的异常时,你实际看到的总是相同的堆栈跟踪——它是未捕获的异常处理程序。异常的类型会记录到运行控制台,但如果您想查看引发异常的位置的回溯,那就是断点的用途。

    【讨论】:

    • 点击⌘⌥B,选择运行→显示→断点,或选择运行→管理断点→​​添加符号断点。
    • 在调试器中停止后,可以输入po $eax(模拟器)或po $r0(设备)查看异常。这是因为异常对象作为第一个参数传递给 objc_exception_throw,保存在寄存器 r0 或 EAX 中。 HTH
    • 在 Xcode 4.5.2 中,您可以在以下位置找到它:产品 → 调试 → 创建符号断点...
    • 还要确保您在调试导航器中选择了“objc_exception_throw”,而不是在输入“po $eax”时选择了麻烦的“main.m”。
    • @EthanHolshouser:不,不是。模拟器使用您计算机的主机架构。唯一的区别是在模拟 arm64 二进制文件时,模拟器将运行 x86_64 而不是 i386,这使它成为 $rdi 而不是 $eax。同样,在实际的 arm64 设备上,您可能需要$x0 而不是$r0
    【解决方案2】:

    在新的 Xcode(至少从 v4.5 开始)中,您可以通过执行以下操作轻松捕获所有异常:

    1. 调出断点导航器 (⌘6)
    2. 点击左下角的+
    3. 添加异常断点

    我认为以上内容与objc_exception_throw 上的断点相同。 http://samwize.com/2012/09/26/xcode-4-dot-5-tips-and-tricks/

    【讨论】:

      【解决方案3】:

      http://ijoshsmith.com/2011/11/28/debugging-exceptions-in-xcode-4-2/

      与samewize 的解决方案相同,但也展示了如何在所有项目中默认显示此断点(右键单击断点,将断点移动到,用户)。

      【讨论】:

        【解决方案4】:

        正如 Kevin 所回答的,通过在 objc_exception_throw 处设置断点,您会发现更多有用的调试信息。

        如果您使用的是 Xcode 4.2,您可以通过转到 Breakpoint Navigator > 单击左下角的添加图标 > 添加符号断点 > 输入 objc_exception_throw 符号 > 完成来添加此符号断点。

        【讨论】:

        • 迟到总比不到好。这将是我以后为每个项目做的第一件事。超级好用。感谢 Daryl Spitzer、@kevin-ballard 和 samwize
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-26
        • 2014-11-13
        • 2015-12-30
        • 1970-01-01
        • 2013-07-23
        相关资源
        最近更新 更多