跳转至

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 对象的内存地址信息。

代码分解:

  1. withUnsafePointer(to:_:):
  2. 这是一个 Swift 标准库函数,用于获取指向某个值(这里是 person)的不安全指针
  3. 第一个参数 to: &person 表示要获取 person 变量的指针(& 是取地址操作符)。
  4. 第二个参数是一个闭包,该闭包接收一个 UnsafePointer 参数(这里是 $0)。

  5. { print($0) }:

  6. 这是闭包的具体实现,它会打印传入的指针($0 是闭包的第一个参数,即指向 person 的指针)。
  7. 打印的内容是指针的内存地址(如 0x00007ffee3b4b8d0)。

  8. po:

  9. 这是 LLDB 调试器命令(在 Xcode 控制台中使用),代表 "print object"。
  10. 它会尝试以更友好的方式打印对象信息(在这里是打印指针地址)。

实际作用:

这段代码会输出 person 对象在内存中的地址。例如:

0x00007ffee3b4b8d0

注意事项:

  1. 不安全指针
  2. UnsafePointer 是直接操作内存的指针,Swift 一般不推荐直接使用,除非需要与 C API 交互或进行底层优化。
  3. 在闭包中访问指针时需要确保 person 的内存未被释放。

  4. 调试场景

  5. 通常在调试时用 po 直接打印对象内容(如 po person),而不是指针地址。
  6. 打印地址可能用于检查对象是否相同(比如判断两个变量是否指向同一实例)。