LLDB

优质
小牛编辑
127浏览
2023-12-01

LLDB 常用调试指令

The LLDB Debugger

help

任何命令行工具类的工具都需要这样一个帮助入口, 帮助我们快速熟悉一个新的指令, 使用格式如下:

  help expression

查看expression的使用介绍

print

可以使用printprinpri或者p, 但是不能使用pr, 因为LLDB不能消除和process的歧义 p/po

po: 输出值 或者 对象的地址
p: 输出值 + 值类型 + 尹永明 + 内存地址

通过打印相同的实例对象p对比

  (lldb) p p
  (Person *) $5 = 0x0000000100550b50
  (lldb) po p
  <Person: 0x100550b50>

结果中有个$5, 任何以$符开头的东西都是存在于LLDB的命名空间的, 它们是为了帮助我们进行调试而存在的. 除此之外, p还支持进制转换, 默认p是十进制打印

  • p/t

    二进制打印

    e.g.

    (lldb) p/t p
    (Person *) $1 = 0b0000000000000000000000000000000100000000010101010000101101010000
    
  • p/c

    数字转十进制字符

    (lldb) p/c 66
    (int) $9 = B\0\0\0
    
  • p/c

    打印以空中指的字符串(以\0结尾的字符串)

  • p/x

    十六进制打印

    (lldb) p/x 100
    (int) $7 = 0x00000064
    
    (lldb) p/x (float)100.0
    (float) $9 = 0x42c80000
    (lldb) p/x (double)100.0
    (double) $10 = 0x4059000000000000
    
  • p/o

    八进制打印

    (lldb) p/o 100
    (int) $6 = 0144
    
  • p/d

    字符转十进制数字

    (lldb) p/d 'A'
    (char) $8 = 65
    

expression

在运行时修改环境中的某个值, 这非常有用, 配合断点调试, 帮助我们mock一些场景

e.g.

  expression count = 18

通常简写为e, 我的习惯是expr

更新UI

通过执行以下命令, 可以在控制台快速查看视图层级

  (lldb) po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]

一些断点调试场景下, 可以在LLDB环境下完成

e.g. 例如在断点下通过在控制台下同构LLDBexpression指令调整了某个UIView控件的背景色, 直接执行一下指令来刷新UI

  (lldb) e (void)[CATransaction flush]

补充: 只有程序在继续运行之后才会看到界面的变化. 因为改变的内容必须被发送到渲染服务中,然后显示才会被更新. 渲染服务实际上是一个另外的进程(被称作backboardd).这就是说即使我们正在调试的内容所在的进程被打断了, backboardd也是继续运行着的. 因此我们在断点情况下通过LLDB执行上面的命令,实现了UI的更新操作.

memory read

查看当前对象的内存情况, 简写x

e.g. p是实例化的一个对象指针

  (lldb) x p
  0x100550b50: 8d 22 00 00 01 80 1d 00 78 10 00 00 01 00 00 00  ."......x.......
  0x100550b60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

使用相同的p对象, 不同格式输出:

  • x/4gx

    (lldb) x/4gx p
    0x100550b50: 0x001d80010000228d 0x0000000100001078
    0x100550b60: 0x0000000000000000 0x0000000000000000
    
  • x/4gw

    (lldb) x/4gw p
    0x100550b50: 0x0000228d 0x001d8001 0x00001078 0x00000001
    

    参数解读:
    4 : 打印4段, 否则需要眼睛人工分段查看
    g : 格式化输出(iOS为小端存储模式, 数据的高字节存储在高地址中,数据的低字节存储在低地址,对比xx/4gx结果,x/4gx是按照正常的书写格式输出, 低位在右, 高位在左)
    x : 每一段以十六进制打印
    w :以十六进制打印,但只输出八位

thread

  • hread backtrace

    查看线程和堆栈框架描述的信息

    也可以使用bt查看线程信息

  • thread backtrace all可以使用bt all