当前位置:  开发笔记 > 编程语言 > 正文

如何找出Xcode调试器(适用于iPhone)中引发的异常?

如何解决《如何找出Xcode调试器(适用于iPhone)中引发的异常?》经验,为你挑选了3个好方法。

我正在学习Erica Sadun的iPhone开发者手册中的iPhone编程.当我按照模拟器中第81页开始的温度转换示例中的步骤运行我创建的应用程序时,它会因未捕获的异常而终止.(有关我发布到iPhoneSDK Google 网上论坛的问题,请参阅http://groups.google.com/group/iphonesdk/browse_frm/thread/6f44a90fdb8da28a?hl=en.)

从main()调用UIApplicationMain()后抛出异常.如果我查看调试器中的堆栈跟踪,我看到的只是(当然)汇编.我怎样才能知道抛出了什么样的异常?

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



1> Lily Ballard..:

在断点处设置objc_exception_throw并通过Debug而不是Run运行您的应用程序

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


在调试器中停止后,可以输入`po $ eax`(模拟器)或`po $ r0`(设备)来查看异常.这是因为异常对象作为objc_exception_throw的第一个参数传递,它保存在寄存器r0或EAX中.HTH
@EthanHolshouser:不,不是.模拟器使用计算机的主机架构.唯一的区别是当模拟arm64二进制文件时,模拟器将运行x86_64而不是i386,这使得它成为`$ rdi`而不是`$ eax`.同样,在实际的arm64设备上,你可能想要`$ x0`而不是`$ r0`.
在Xcode 4.5.2中,您可以在以下位置找到它:Product→Debug→Create Symbolic Breakpoint ...
还要确保在输入"po $ eax"时在调试导航器中选择了"objc_exception_throw"而不是麻烦的"main.m".
按⌘⌥B,选择运行→显示→断点,或选择运行→管理断点→​​添加符号断点.
有趣的是,在arm64模拟器(x86_64)上,寄存器有同义词`$ arg1`,`$ arg2`等,所以你不必记住`$ rdi`.不幸的是,在armv7模拟器(即i386)上并非如此.我不知道设备调试是否属实,因为我现在还没有设置实际在设备上运行代码.您可以通过`register read -A`查看是否为真,它会为每个寄存器打印"备用名称"(如果有).

2> samwize..:

在新的Xcode中(至少从v4.5开始),您可以通过这样做轻松捕获所有异常:

    打开断点导航器(⌘6)

    点击左下方的+

    添加异常断点

我认为以上内容与断点相同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的解决方案相同,但也显示了如何在所有项目中默认显示此断点(右键单击断点,Move Breakpoint To,User).

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有