LLDB调试

一、LLDB

默认内置于Xcode中的动态调试工具。标准的 LLDB 提供了一组广泛的命令,旨在与老版本的 GDB 命令兼容。 除了使用标准配置外,还可以很容易地自定义 LLDB 以满足实际需要。在日常的开发和调试过程中给开发人员带来了非常多的帮助。

二、LLDB语法

[ [...]] [-options [option-value]] [argument [argument...]]

(命令)和(子命令):LLDB调试命令的名称。
:执行命令的操作
:命令选项
:命令的参数
[]:表示命令是可选的,可以有也可以没有

三、常用的LLDB调试命令

(一)断点设置

命令 效果
breakpoint set -n 某函数名 给某函数下断点
breakpoint set -n "[类名 SEL]" -n "[类名 SEL]" ... 给多个方法下断点,形成断点组
breakpoint list 查看当前断点列表
breakpoint disable(enable) 组号(编号) 禁用(启用)某一组(某一个)断点
breakpoint delete 编号 禁用某一个断点
breakpoint delete 组号 删除某一组断点
breakpoint delete 删除所有断点
breakpoint set --selectore 方法名 全局方法断点,工程所有该方法都会下断点
brepoint set --file 文件名.m --selector 方法名 给.m实现文件某个方法下断点
breakpoint set -r 字符串 遍历整个工程,含该字串的方法、函数都会下断点
breakpoint command add 标号 某标号断点过后执行相应命令,以Done结束,类似于Xcode界面Edit breakpoint
breakpoint command list 标号 列出断点过后执行的命令
breakpoint command delete 删除断点过后执行的命令

(二)流程控制

命令 效果
c continue 继续执行
n next 单步运行,将子函数当做整体一步执行
ni 单步运行汇编级别
s 单步运行,遇到子函数会进去
si 单步运行可跳转指令内部,汇编级别
finish 返回上层调用栈

(三)其他命令

命令 效果
p 语句 动态执行语句(expression的缩写),内存操作(下同)
expression 语句 同上,可缩写成exp
po 语句 打印对象desc信息
image list 列出所有加载的模块 缩写im li
image list -o -f 模块名 只列出输入模块名信息,常用于主模块
bt 查看当前调用栈
up 查看上一个调用函数
down 查看下一个调用函数
frame variable 查看函数参数
frame select 标号 查看指定调用函数
dis -a $pc 反汇编指定地址,此处为pc寄存器对应地址
thread info 输出当前线程信息
b trace -c xxx 满足某个条件后中断
target stop-hook add -o "frame variable" 断点进入后默认做的操作,这里是打印参数
help 指令 查看指令信息
thread return 不再执行往下代码,直接从当前调用栈返回一个值
register read 读取所有寄存器值
register read $x0 读取x0寄存器值
register write $x1 10 修改x1寄存器的值为10
p/x 以十六进制形式读取值,读取的对象可以很多
watchpoint set variable p->_name 给属性添加内存断点,属性改变时会触发断点,可以看到属性的新旧值,类似KVO效果
watchpoint set expression 变量内存地址 效果同上。

四LLDB高级调试

(一)、使用Python脚本
lldb提供了很多(API)[https://lldb.llvm.org],可以使用Python脚本调用。
开源库:
chisel :Facebook开源LLDB命令工具
LLDB:Derek Selander开源的工具

chisel安装:


LLDB调试_第1张图片
A70626E40DCD164BE3E3D8C8BE31F2E7.png

安装成功后,重启Xcode或者在lldb下输入commdnd source ~/.lldbinit,即可使用chisel.
LLDB安装:
git clone代码,配置~/.lldbinit
command script import /opt/LLDB/lldb_commands/dslldb.py

(二)、常用命令用法
以下参数address均为对象内存地址

命令 效果
pviews 打印当前界面结构和View,如果出错,先导入UIKit
pvc 打印主窗口所有ViewController
methods address 打印类的所有方法以及对应的IMP地址
ivars address 打印类所有的成员变量
presponder address 打印控件的响应链
pactions address 打印控件的action
pblock address 打印block的信息,IMP地址、签名,参数为block地址
search UIButton 搜索当前界面下的所有UIButton类及其子类,其他控件同理
flicker address 快速显示和隐藏视图,以快速帮助可视化它的位置
dismiss dismiss一个正在显示的控制器
visualize address 预览UIImage,CGImageRef, UIView, CALayer, NSData (of an image), UIColor, CIColor, or CGColorRef类型的对象
fv classNameRegex 匹配给出的类名正则表达式,在当前界面结构View的继承层次上查找视图
fvc classNameRegex 匹配给出的类名正则表达式,在当前界面结构ViewController的继承层次上查找VC
show/hide address 、tv address 显示或隐藏某个view或者layer,无须继续程序执行,即时性。经测试,show的时候不用,hide的时候需要resuming
mask/unmask address 在某个view/layer上覆盖一层view,主要是定位目标视图、层的范围
border/unborder address 在某个view/layer上添加边框,查找目标的位置
caflush 强制核心动画刷新,将重新绘制UI,可能会打乱正在进行的动画
bmessage 在类的方法或实例的方法上设置符号断点,不必担心层次结构中的哪个类实际实现了该方法,eg:bmessage -[0x1063e0290 continueButtonClicked]
wivar 给某对象实例变量设置一个watchpoint
sbt 打印还原符号表的函数调用栈

五、小结

LLDB调试工具十分强大,以上 介绍的只是一些常用的命令,,如需要更详细的命令请查询LLDB 的官方API文档

你可能感兴趣的:(LLDB调试)