gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:42 25 4
gpt4 key购买 nike

好的,假设我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com