其他

LLDB调试

2019-01-02  本文已影响7人  king_jensen

一、LLDB

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

二、LLDB语法

<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]

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

三、常用的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安装:


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 <viewController> 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 <expressign> 在类的方法或实例的方法上设置符号断点,不必担心层次结构中的哪个类实际实现了该方法,eg:bmessage -[0x1063e0290 continueButtonClicked]
wivar <object> <ivarName> 给某对象实例变量设置一个watchpoint
sbt 打印还原符号表的函数调用栈

五、小结

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

上一篇下一篇

猜你喜欢

热点阅读