objective-c - 代码/LLDB : How to get information about an exception that was just thrown?

标签 objective-c iphone xcode debugging lldb

好的,假设我在 objc_exception_throw 中的断点刚刚触发。我正坐在调试器提示符下,我想获得有关异常对象的更多信息。我在哪里可以找到它?

最佳答案

异常对象作为第一个参数传入objc_exception_throw。 LLDB 提供了 $arg1..$argn 变量来引用正确调用约定中的参数,从而使打印异常详细信息变得简单:

(lldb) po $arg1
(lldb) po [$arg1 name]
(lldb) po [$arg1 reason]

确保在执行这些命令之前选择调用堆栈中的 objc_exception_throw 帧。请参阅 WWDC15 session 视频中的“高级调试和地址清理器”,以查看在舞台上执行的操作。

过时信息

如果您使用的是 GDB,则引用第一个参数的语法取决于您正在运行的体系结构的调用约定。如果您在实际的 iOS 设备上进行调试,则指向该对象的指针位于寄存器 r0 中。要打印它或向它发送消息,请使用以下简单语法:

(gdb) po $r0
(gdb) po [$r0 name]
(gdb) po [$r0 reason]

在 iPhone Simulator 上,所有函数参数都在堆栈上传递,因此语法要可怕得多。我能构造的最短表达式是 *(id *)($ebp + 8)。为了减轻痛苦,我建议使用一个方便的变量:

(gdb) set $exception = *(id *)($ebp + 8)
(gdb) po $exception
(gdb) po [$exception name]
(gdb) po [$exception reason]

您还可以通过将命令列表添加到objc_exception_throw 断点来在触发断点时自动设置$exception

(请注意,在我测试的所有情况下,异常对象在断点命中时也存在于 eaxedx 寄存器中。我不确定不过,情况总是如此。)

从下面的评论添加:

lldb 中,选择 objc_exception_throw 的堆栈帧,然后输入此命令:

(lldb) po *(id *)($esp + 4)

关于objective-c - 代码/LLDB : How to get information about an exception that was just thrown?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12223875/

相关文章:

ios - 添加对象到 NSMutableArray

ios - 检测设备是否为 iPhone X

iphone - 以编程方式删除 UIScrollView 中的内容?

ios - 找不到Ionic 3应用程式的'Branch.h'文件Xcode错误

ios - 如何将 MainView-iPad.xib 重新连接到 viewController?

ios - 需要建议在 iOS 开发中集成 Gmail 帐户

ios - 是否可以在没有键盘的情况下选择 UITextField?

ios - 使用 Three20 更新应用程序

iphone - 如何测试倾斜效果? - iPhone模拟器

objective-c - 委托(delegate)和 IBAction