返回

lldb 常用命令与调试技巧

IOS

lldb:深入浅出地了解 macOS 调试神器

lldb 是一款功能强大的开源调试工具,内置于 Xcode,旨在助力 macOS 开发者快速定位和调试 bug,无论是在正向开发还是逆向工程中,它都发挥着举足轻重的作用。

lldb 基础

lldb 简化了调试命令,采用头部匹配方式,用户可以随意简化某个命令,只要不造成歧义即可。单步调试通常分为两大类:源码级和汇编级。

源码级调试

源码级调试允许用户逐行执行代码,同时检查变量和寄存器的值。常用的命令包括:

  • breakpoint set 在指定行号处设置断点。
  • breakpoint list 列出当前会话中的所有断点。
  • breakpoint disable 禁用指定的断点。
  • step 单步执行下一条指令。
  • next 单步执行到下一行代码。
  • finish 单步执行当前函数,直到其返回。
  • continue 继续执行程序,直到遇到断点或退出。

汇编级调试

汇编级调试提供了更底层的视图,允许用户检查机器指令和内存值。常用的命令包括:

  • disassemble 反汇编指定的函数或代码范围。
  • register read 读取指定寄存器的值。
  • register write 写入指定寄存器的值。
  • memory read 读取指定内存地址的值。
  • memory write 写入指定内存地址的值。

其他有用的命令

除了上述命令之外,lldb 还提供了许多其他有用的命令,包括:

  • expr 计算任意表达式并显示其结果。
  • po 打印对象的值,类似于 printf
  • bt 打印调用堆栈。
  • frame select 选择要检查的帧。
  • watchpoint set variable 设置变量观察点,当变量值改变时触发。

实战案例

反汇编函数并检查寄存器值

(lldb) disassemble main
(lldb) register read eax

设置断点并单步执行

(lldb) breakpoint set --line 23
(lldb) run
(lldb) step
(lldb) next

深入学习资源

常见问题解答

  1. lldb 与 gdb 有什么区别?
    lldb 专门为 macOS 设计,而 gdb 则是一种通用的调试工具。lldb 通常更易用,但功能性上不如 gdb 强大。
  2. 如何将断点导出为文件?
    使用 breakpoint write 命令,例如:
    (lldb) breakpoint write my_breakpoints.txt
    
  3. 如何从命令行使用 lldb 调试应用程序?
    通过 lldb 命令后跟要调试的应用程序路径,例如:
    $ lldb /path/to/my_app
    
  4. 如何检查变量的类型?
    使用 ptype 命令,例如:
    (lldb) ptype my_variable
    
  5. lldb 支持哪些处理器架构?
    lldb 支持 x86、x86-64、ARM 和 ARM64 等常见处理器架构。