LLDB工具使用

??授人以鱼不如授人以渔,我们常常看到别人使用屌屌的LLDB指令,完成屌屌的动态调式,我们总是送上仰望的眼神(大神啊!),我们其实可以自己查一下所有的LLDB指令,并了解他们的使用方法和相关语法,达到我们的调试目的。
在终端输入lldb进入LLDB动态调试环境,并输入help即可查看所有的LLDB命令:

LLDB工具使用
文章图片
image.png
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的默认格式显示任何返回值.
print 计算当前线程上的表达式。使用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

LLDB工具使用
文章图片
breakpoint指令
LLDB工具使用
文章图片
b指令 如果觉得好,请给一个撒 ??或者如果想要了解某一个命令组合的使用可以在终端输入:help + command + subcommand,以此类推。
eg: help target symbols
LLDB工具使用
文章图片
image.png 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 当前frame,偏移的下标可看到汇编
frame variable 显示当前栈帧的所有变量
thread return NO/YES 可用于控制成了的流程,在执行时它会把可选参数加载进返回寄存器,然后立即执行返回命令,跳出当前栈帧,使得函数的剩余部分不会被执行
po self.upButtonLoad.allTargets
e UIButton *myBtn actionsForTarget:(id)0x10e709bf0 forControlEvent:0] 可拿到事件SEL
【LLDB工具使用】watchpoint (command,delete,disable ,enable ,ignore, list ,set)
watchpoint command add “frame variable” 只要断点一来就执行frame variable执行,也可以通过watchpoint command list展示,通过watchpoint command delete删除

    推荐阅读