LLDB 基础使用指南
1. 准备工作:编译时添加调试信息
要使用 LLDB 调试程序,必须在编译时生成调试符号。在 GCC 或 Clang 中,添加 -g 选项:
1 2 3
| g++ main.cc -g -o main
clang++ main.cc -g -o main
|
2. 启动 LLDB
有两种方式启动调试:
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. 退出调试
| 命令 |
说明 |
quit 或 exit |
退出 LLDB |
8. 其他常用命令
thread backtrace(简写 bt):查看当前线程的调用栈。
frame select <序号>:切换到指定栈帧。
help:查看帮助信息,例如 help breakpoint 查看断点相关命令。
register read:查看寄存器值。
提示:
- 大多数命令都有缩写形式,如上表所示,可提高调试效率。
- LLDB 支持命令补全,按
Tab 键可自动补全命令或参数。
- 若使用 LLDB 调试 C++ 程序,
po 命令对没有 Objective-C 运行时支持的对象可能输出地址,此时可使用 p 查看原始值。