如何在LLDB中通过指定内存地址打印Swift对象?
如何在LLDB中通过指定内存地址打印Swift对象?
我太懂这种落差感了!在ObjC调试里,po $x0简直是查看第一个参数对象的利器,结果到Swift里直接用就报错,确实挺闹心的。这是因为Swift的强类型特性加上LLDB的上下文处理逻辑和ObjC不一样,下面给你几个实用的解决办法:
方法1:直接查看栈帧参数(最省心)
如果是在函数断点里,直接用frame variable(可以简写为fr v)命令,它会列出当前栈帧的所有参数和局部变量,找到你要的那个对象后,直接用po加参数名就能查看详情:
fr v # 列出当前栈帧的所有变量与参数 po myFirstParameter # 替换成实际的参数名称
这个方法不需要记寄存器,LLDB会自动帮你处理Swift对象的类型解析,新手友好度拉满。
方法2:通过寄存器地址强制类型转换
如果你还是习惯用寄存器操作,先读取x0寄存器的内存地址:
register read x0
假设得到的地址是0x0000000100704a70,接下来用Swift的unsafeBitCast把地址转换成对应的对象类型,就能用po查看完整详情了:
po unsafeBitCast(0x0000000100704a70, to: YourCustomObject.self)
记得把YourCustomObject替换成你实际的对象类型(比如UIViewController.self或者你自己定义的类名)。
方法3:用LLDB表达式命令强制输出
还有个更快捷的方式,直接用expression -O(-O参数等价于po的对象输出格式)命令,结合类型转换:
expression -O -- unsafeBitCast($x0, to: YourCustomObject.self)
要是直接用$x0还是报错“找不到in scope”,就换成方法2里先读取地址再转换的方式就行。
额外小技巧
如果不确定对象的具体类型,可以先用这两个命令快速排查:
memory read --format=o $x0:查看对象的概要信息image lookup --address $x0:查找该内存地址对应的类型信息
内容来源于stack exchange
相关产品推荐
相关产品推荐

