LLDB ① 介绍和流程控制
什么是 LLDB
LLDB(Low Lever Debug) 是 macOS 上 Xcode 中的默认调试器,支持在桌面和 iOS 设备和模拟器上调试 C、Objective-C 和 C++。
LLDB 是作为一组可重用的组件构建的,这些组件高度利用了较大的 LLVM 项目中的现有库,例如 Clang 表达式解析器和 LLVM 反汇编器。
标准的 LLDB 提供了一组广泛的命令,旨在与老版本的 GDB 命令兼容。 除了使用标准配置外,其可以安装 C++ 或者 Python 插件,可以很容易地自定义 LLDB 以满足实际需要。
LLDB 是开源的,LLDB 的代码可以在LLVM中查看。
命令
命令结构
<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]
- <command>(命令)和<subcommand>(子命令):LLDB调试命令的名称。
- <action>:执行命令的操作
- <options>:命令选项
- <arguement>:命令的参数
- []:表示命令是可选的,可以有也可以没有
命令选项
LLDB 中的命令选项有规范形式(canonical,也称为“discoverable”)和缩写形式(abbreviated)。
lldb 调试
Xcode 进入
通过命中断点或点击 Pause program execution
进入 LLDB 调试模式。
终端进入
在终端中输入 lldb 进入 LLDB 调试模式
help 命令
在 LLDB 中执行 help
命令就会列出所有命令列表,对于 LLDB 中的所有命令都可以查看文档 help {command}
。
LLDB 部分命令表
命令 | 描述 |
---|---|
apropos | 模糊搜索命令 |
breakpoint | 操作断点 |
command | 自定义命令 |
disassemble | 反汇编指定命令 |
expression | 在当前线程上计算表达式。使用LLDB的默认格式显示任何返回值。 |
frame | 选择和检查当前线程堆栈 |
language | 切换语言 objc,swift,cplusplus |
log | 控制 LLDB 内部输出 |
memory | 操作内存 |
plugin | 管理 LLDB plugin |
register | 用于访问当前线程的寄存器 |
process | 进程交互 |
session | 管理 LLDB session |
settings | LLDB 设置 |
source | 用于检查由当前目标进程的调试信息描述的源代码的命令 |
statistics | 打印调试会话的统计信息 |
swift-healthcheck | 显示LLDB调试器运行状况检查诊断 |
target | 用于在调试器目标上操作的命令 |
thread | 用于在当前进程中的一个或多个线程上操作的命令 |
trace | 用于加载和使用处理器跟踪信息的命令 |
type | 用于在系统类型上操作的命令 |
version | LLDB 版本 |
watchpoint | 观察点用于内存 |
trace | 用于加载和使用处理器跟踪信息的命令 |
type | 用于在系统类型上操作的命令 |
LLDB 部分命令缩写
缩写(abbreviations) | 完整命令 | 描述 |
---|---|---|
add-dysm | target symbols add | 通过指定调试符号文件的路径或使用选项指定模块,将调试符号文件添加到目标的当前模块之一 |
attach | - | 按ID或名称附加到进程。 |
b | breakpoint set | 设置符号断点 |
bt | - | 显示当前线程调用栈 |
c 、continue | process continue | 继续当前程序 |
call、p、print | expression -- | 在当前线程上计算表达式。使用LLDB的默认格式显示任何返回值。 |
di、dis | disassemble | 反汇编指定命令 |
display | target stop-hook | 在每次停止时计算表达式 |
down | - | 选择较新的堆栈,默认为1 |
up | - | 选择较旧的堆栈,默认为1 |
env | - | 查看和设置环境变量 |
exit、 q | quit | 退出 LLDB |
f | thread backtrace | 从当前线程中按索引选择当前堆栈帧 |
finish | thread step-out | 完成当前堆栈的执行并在返回后停止 |
image | target modules | 用于访问一个或多个目标模块信息的命令。 |
kill | process kill | 终止当前程序 |
l、list | - | 列出相关源代码 |
n、next | thread step-over | 源码级别的单步执行,跨步调用 |
ni、nexti | thread step-inst-over | 指令级别的单步执行,跨步调用 |
po | expression -O -- | 输出 Object 描述 |
re | register | 用于访问当前线程的寄存器 |
s | thread step-in | 源码级别的单步执行,单步调用 |
si | thread step-inst | 指令级别的单步执行,单步调用 |
t | thread select | 切换线程 |
v、var | frame variable | 当前堆栈变量 |
vo | frame variable -O | 输出当前堆栈变量的描述 |
x | memory read | 读取内存 |
LLDB 流程控制
process continue
process continue
取消程序当前的暂停,使程序继续执行。 c
是 process continue
的缩写形式
执行单步操作
-
对应 Xcode 中的step overthread step-over
源码级别的单步执行,跨步调用。执行一行代码,如果所在这行代码是一个函数调用,那么就不会跳进这个函数,而是会执行这个函数,然后继续。n
是thread step-over
的缩写形式 -
thread step-in
源码级别的单步执行,单步调用。执行一行代码,如果所在这行代码是一个函数调用,那么会跳进这个函数。
对应 Xcode 中的step intos
是thread step-in
的缩写形式 -
thread step-inst
和thread step-inst-over
指令级别的单步执行,执行一行代码。(遇到汇编函数,会进入汇编函数内部)。
'ni' 是thread step-inst-over
的缩写形式,thread step-inst-over
与thread step-over
类似。
si
是thread step-inst
的缩写形式,thread step-inst
与thread step-in
类似。
thread step-out
thread step-out
完成当前堆栈的执行并在返回后停止。。finish
是 thread step-out
的缩写形式
thread return
thread return
可以使得当前函数立即返回,也就是说,后续代码都不会执行了。