授人以鱼不如授人以渔,我们常常看到别人使用屌屌的LLDB指令,完成屌屌的动态调式,我们总是送上仰望的眼神(大神啊!),我们其实可以自己查一下所有的LLDB指令,并了解他们的使用方法和相关语法,达到我们的调试目的。
在终端输入lldb
进入LLDB动态调试环境,并输入help即可查看所有的LLDB命令:
LLDB的调式命令
命令 | 注释 |
---|---|
apropos | 列出与单词或主题相关的调试器命令. |
breakpoint | 操作断点的命令 (参见 'help b' 的简写.) |
bugreport | 用于创建特定的bug报告的命令. |
command | 自定义LLDB命令管理命令. |
disassemble | 反汇编当前目标中的指定指令。默认为当前线程和堆栈帧的当前函数. |
expression | 计算当前线程上的表达式。使用LLDB的默认格式显示任何返回值. |
frame | 用于选择和检查当前线程的堆栈帧的命令. |
gdb-remote | 通过远程GDB服务连接一个进程. 如果没有指定主机,则假定为localhost. |
gui | 切换到基于GUI的模式. |
help | 显示所有调式命令,或者关于制定命令的详情. |
kdp-remote | 通过远程KDP服务连接一个进程,如果没有制定UDP端口,就默认使用41139端口. |
language | 制定命令的语言. |
log | 控制LLDB内部日志记录的命令. |
memory | 用于操作当前目标进程内存的命令. |
platform | 管理和创建平台的命令. |
plugin | 管理LLDB插件的命令. |
process | 用于与当前平台上的进程交互的命令. |
quit | 退出LLDB调式. |
register | 用于访问当前线程和堆栈帧的寄存器的命令. |
reproducer | 控制LLDB复制器的命令. |
script | 使用提供的代码调用脚本注释器并显示任何结果。如果没有提供代码,则启动交互式注释器. |
settings | 管理LLDB设置的命令. |
source | 用于检查由当前目标进程的调试信息描述的源代码的命令. |
statistics | 打印调试会话的统计信息 |
target | 用于操作调试器目标的命令。 |
thread | 在当前进程操作一个或多个线程的命令. |
type | 用于在类型系统上操作的命令. |
version | 显示LLDB 调试器版本. |
watchpoint | 在观察点上操作的命令. |
一些命令的缩写(输入“帮助命令别名”获取更多信息):
缩写指令 | 注释 |
---|---|
add-dsym | 将调试符号文件添加到目标的模块 |
attach | 通过ID或名称附加到进程 |
b | 设置断点的一种简写格式 |
bt | 显示当前线程调用堆栈,可加任何数字显示最多堆栈。或'all'显示所有线程. |
c | 继续执行当前进程中所有线程 |
call | 计算当前线程上的表达式。使用LLDB的默认格式显示返回值 |
continue | 继续执行当前进程中的所有线程. |
detach | 与当前目标进程分离. |
di | 反汇编当前目标中的指定指令。默认为当前线程和堆栈帧的当前函数. |
dis | 汇编当前目标中的指定指令。默认为当前线程和堆栈帧的当前函数. |
display | 在每个stop处计算一个表达式(参见'help target stop-hook')。 |
down | 选择一个更新的堆栈帧。默认情况下移动一帧,数值参数可以指定任意数字. |
env | 查看和设置环境变量的简写。 |
exit | 退出 LLDB 调试. |
f | 从当前线程中按索引选择当前堆栈帧(参见thread backtrace)。 |
file | 使用该参数作为主可执行文件创建一个target. |
finish | 完成当前堆栈帧的执行,返回后停止。默认为当前线程,除非指定. |
image | 用于访问一个或多个目标模块信息的命令. |
j | 将程序计数器设置为新地址. |
jump | 将程序计数器设置为新地址. |
kill | 终止当前目标进程. |
l | 使用几种简写格式之一列出相关的源代码. |
list | 使用几种简写格式之一列出相关的源代码. |
n | 源码单步,跨步调用. 默认当前线程,除非指定. |
next | 源码单步,跨步调用. 默认当前线程,除非指定.. |
nexti | 指令级单步、跨步调用。默认为当前线程,除非指定. |
ni | 指令级单步、跨步调用。默认为当前线程,除非指定. |
p | 计算当前线程上的表达式。使用LLDB的默认格式显示任何返回值. |
parray | 计算当前线程上的表达式。使用LLDB的默认格式显示任何返回值. |
po | 计算当前线程上的表达式。显示格式由类型的作者控制的任何返回值. |
poarray | 计算当前线程上的表达式。使用LLDB的默认格式显示任何返回值. |
计算当前线程上的表达式。使用LLDB的默认格式显示任何返回值. | |
q | 退出 LLDB 调试. |
r | 加载调试器中的可执行文件. |
rbreak | 在可执行文件中设置一个或一组断点. |
re | 用于访问当前线程和堆栈帧的寄存器的命令. |
repl | 计算当前线程上的表达式。使用LLDB的默认格式显示任何返回值. |
run | 加载调试器中的可执行文件. |
s | 源码级单步,进入调用。默认为当前线程,除非指定. |
si | 指令级单步,进入呼叫。默认为当前线程,除非指定。 |
sif | 步骤遍历当前块,如果直接进入名称与TargetFunctionName匹配的函数,则停止. |
step | 源码级单步,进入调用。默认为当前线程,除非指定. |
stepi | -- 指令级单步,进入呼叫。默认为当前线程,除非指定. |
t | 更改当前选择的线程。 |
tbreak | 使用几种简写格式中的一种设置一次性断点. |
undisplay | 在每个Stop(由Stop -hook index指定)处停止显示表达式 |
up | 选择旧的堆栈帧。默认情况下移动一帧,数值参数可以指定任意数字. |
v | 显示当前堆栈帧的变量。默认为作用域内的所有参数和局部变量。 |
var | 显示当前堆栈帧的变量。默认为作用域内的所有参数和局部变量。 |
vo | 显示当前堆栈帧的变量。默认为作用域内的所有参数和局部变量。 |
x | 从当前目标进程的内存中读取. |
如果想要了解某一个命令的使用可以在终端输入:help + command
eg:要查看breakpoint
的使用,help breakpoint
如果觉得好,请给一个👍撒
或者如果想要了解某一个命令组合的使用可以在终端输入:help + command + subcommand
,以此类推。
eg: help target symbols
n(单步,碰到函数算一步,thread step-over,next)
c 继续执行,取消暂停
s(单步,碰到函数会进去,thread step in)
expression(expr,e)
po(只输出结果,包含值)
p/print(输出有类型,地址别名,值,即description)
breakpoint(break,b) set -n “名字” 如“-[viewController viewDidLoad]”
break set -r 字符串 工程所有含字符串都下断点如viewDidLoad
b -[viewController viewDidLoad]
b isEmpty 在C语言函数上下断点,
p/x 18 以十六进制输出18
p/t 16 以二进制输出16
p/d 0x00000012 以十进制输出
thread backtrace 当前线程回溯,可看到当前断点之前所有frame
frame select -r <index-offset> 当前frame,偏移的下标可看到汇编
frame variable 显示当前栈帧的所有变量
thread return NO/YES 可用于控制成了的流程,在执行时它会把可选参数加载进返回寄存器,然后立即执行返回命令,跳出当前栈帧,使得函数的剩余部分不会被执行
po self.upButtonLoad.allTargets
e UIButton *myBtn actionsForTarget:(id)0x10e709bf0 forControlEvent:0] 可拿到事件SEL
watchpoint (command,delete,disable ,enable ,ignore, list ,set)
watchpoint command add “frame variable” 只要断点一来就执行frame variable执行,也可以通过watchpoint command list展示,通过watchpoint command delete删除