LLDB指令¶
通过help看
-
x 打印对象内存情况
-
x/4gx 查看内存地址的内存结构数据 4:打印4个 g:8字节 x:16进制打印
x/nuf
n:要显示的内存单元的个数
u:一个地址单元的长度
-
b表示单字节
-
h表示双字节
-
w表示四字节
-
g表示八字节
f:显示方式,可取如下值:
- x按十六进制格式显示变量
- d按十进制格式显示变量
- u按十进制格式显示无符号整型
- o按八进制格式显示变量
- t按二进制格式显示变量
- a按十六进制格式显示变量
- i指令地址格式
- c按字符格式显示变量
- f按浮点数格式显示变量
x/6gx x/8gx x/10gx
- register read x0 读寄存器
打开汇编调试,读取寄存器中的值
- register read x0 (x0一般是返回值)
-
register read x1
-
p/x 打印地址
-
po 上面寄存器地址的内容
-
p 内存地址
p 和 po 的区别在于使用 po 只会输出对应的值,而 p 则会返回值的类型以及命令结果的引用名。
- bt 查看调用堆栈 在方法里打断点,查看调用堆栈。
po示例¶
po withUnsafePointer(to: &person) { print($0) }
这段代码是在 Swift 中使用 po
(print object)命令来打印 person
对象的内存地址信息。
代码分解:¶
withUnsafePointer(to:_:)
:- 这是一个 Swift 标准库函数,用于获取指向某个值(这里是
person
)的不安全指针。 - 第一个参数
to: &person
表示要获取person
变量的指针(&
是取地址操作符)。 -
第二个参数是一个闭包,该闭包接收一个
UnsafePointer
参数(这里是$0
)。 -
{ print($0) }
: - 这是闭包的具体实现,它会打印传入的指针(
$0
是闭包的第一个参数,即指向person
的指针)。 -
打印的内容是指针的内存地址(如
0x00007ffee3b4b8d0
)。 -
po
: - 这是 LLDB 调试器命令(在 Xcode 控制台中使用),代表 "print object"。
- 它会尝试以更友好的方式打印对象信息(在这里是打印指针地址)。
实际作用:¶
这段代码会输出 person
对象在内存中的地址。例如:
0x00007ffee3b4b8d0
注意事项:¶
- 不安全指针:
UnsafePointer
是直接操作内存的指针,Swift 一般不推荐直接使用,除非需要与 C API 交互或进行底层优化。-
在闭包中访问指针时需要确保
person
的内存未被释放。 -
调试场景:
- 通常在调试时用
po
直接打印对象内容(如po person
),而不是指针地址。 - 打印地址可能用于检查对象是否相同(比如判断两个变量是否指向同一实例)。