LLDB 基础使用指南

1. 准备工作:编译时添加调试信息

要使用 LLDB 调试程序,必须在编译时生成调试符号。在 GCC 或 Clang 中,添加 -g 选项:

1
2
3
g++ main.cc -g -o main
# 或
clang++ main.cc -g -o main

2. 启动 LLDB

有两种方式启动调试:

  • 直接加载程序

    1
    lldb main
  • 先启动 lldb,再加载程序

    1
    2
    lldb
    (lldb) file main

3. 程序执行控制

命令 缩写 说明
run r 启动程序,程序会在断点处暂停
next n 单步执行(不进入函数内部)
step s 单步执行(进入函数内部)
finish 执行完当前函数,返回到调用处
continue c 继续执行,直到下一个断点或程序结束

4. 查看和修改变量

命令 说明
print <变量名>p <变量名> 打印变量的值
po <指针变量名> 打印 Objective-C / Swift 对象描述(也可用于 C++ 对象,若重载了 description
frame variable 查看当前栈帧中的所有局部变量
expression <变量名> = <新值> 修改变量的值
print /<格式> <变量名> 按指定格式输出:
/t 二进制
/o 八进制
/d 十进制
/x 十六进制

示例:

1
2
3
4
5
6
7
(lldb) p count
(int) $0 = 10
(lldb) p/x count
(int) $1 = 0x0a
(lldb) expression count = 20
(lldb) p count
(int) $2 = 20

5. 查看源码

命令 说明
list 显示当前暂停位置附近的源代码(默认10行)
list <行号> 显示指定行附近的代码
list <文件名>:<行号> 显示指定文件指定行附近的代码
list <函数名> 显示指定函数的代码

示例:

1
2
3
(lldb) list 15          # 显示第15行附近的代码
(lldb) list main.cpp:20 # 显示 main.cpp 第20行附近的代码
(lldb) list MyFunction # 显示 MyFunction 函数的代码

6. 断点管理

设置断点

命令 说明
breakpoint set --name <函数名> 在函数入口处设置断点
breakpoint set --line <行号> 在当前文件指定行设置断点
breakpoint set --file <文件名> --line <行号> 在指定文件的指定行设置断点
breakpoint set --name <正则表达式> --func-regex 使用正则匹配函数名设置断点

示例:

1
2
3
(lldb) breakpoint set --name main
(lldb) breakpoint set --line 42
(lldb) breakpoint set --file main.cpp --line 10

管理断点

命令 说明
breakpoint list 列出所有断点(显示序号及状态)
breakpoint delete 删除所有断点
breakpoint delete <序号> 删除指定序号的断点
breakpoint delete <序号1> <序号2> ... 删除多个断点
breakpoint delete <起始序号>-<结束序号> 删除一段范围内的断点(包括两端)
breakpoint disable <序号> 禁用指定断点(不删除,可重新启用)
breakpoint enable <序号> 启用被禁用的断点

示例:

1
2
3
4
5
6
7
(lldb) breakpoint list
Current breakpoints:
1: name = 'main', locations = 1
2: file = 'main.cpp', line = 10, locations = 1

(lldb) breakpoint delete 2 # 删除序号为2的断点
(lldb) breakpoint disable 1 # 禁用序号为1的断点

7. 退出调试

命令 说明
quitexit 退出 LLDB

8. 其他常用命令

  • thread backtrace(简写 bt):查看当前线程的调用栈。
  • frame select <序号>:切换到指定栈帧。
  • help:查看帮助信息,例如 help breakpoint 查看断点相关命令。
  • register read:查看寄存器值。

提示

  • 大多数命令都有缩写形式,如上表所示,可提高调试效率。
  • LLDB 支持命令补全,按 Tab 键可自动补全命令或参数。
  • 若使用 LLDB 调试 C++ 程序,po 命令对没有 Objective-C 运行时支持的对象可能输出地址,此时可使用 p 查看原始值。

掌握以上基础命令,即可开始使用 LLDB 进行简单的程序调试。更高级的功能(如条件断点、内存查看、脚本支持等)可查阅官方文档或通过 help 命令学习。