LLDB调试命令

一、LLDB

正向开发与逆向都经常会用到LLDB调试,而熟悉LLDB调试对正向、逆向开发都有很大的帮助,尤其是动态调试三方App,此笔记主要记录一些常用的调试命令

二、常用的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 删除断点过后执行的命令
b 内存地址 对内存地址下断点

(二)、其他常用命令

命令 效果
p 语句 动态执行语句(expression的缩写),内存操作(下同)
expression 语句 同上,可缩写成exp
po 语句 print object 常用于查看对象信息
c 程序继续执行
process interrput 暂停程序
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 指令 查看指令信息

(三)、跳转命令、读写命令

命令 效果
n 将子函数整体一步执行,源码级别
s 跳进子函数一步一步执行,源码级别
ni 跳到下一条指令,汇编级别
si 跳到当前指令内部,汇编级别
finish 返回上层调用栈
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 变量内存地址 效果同上

大部分命令可以缩写,这里列出部分几个,可以多尝试缩写,用多了就自然记住了:

  • breakpoint :br、b
  • list:li
  • delete:del
  • disable:dis
  • enable:ena

(四)、使用image lookup定位crash

制造一个数组越界crash:

crash

查看crash位置,对应输出信息是ViewController.m的第20行
crash位置

三、LLDB高级调试技巧

(一)、使用Python脚本

两个开源库:

chisel :Facebook开源LLDB命令工具

LLDB:Derek Selander开源的工具

(二)、安装

LLDB默认会从~/.lldbinit(没有的话可以创建)加载自定义脚本,因此可以在里面添加一些脚本,先使用brew install chisel安装chisel,再分别git clone 两个开源工具代码,然后将以下命令写入.lldbinit文件,重启Xcode即生效(注意开源工具代码路径替换成自己的):

command script import /Users/kinken_yuen/chisel/fblldb.py
command script import /Users/kinken_yuen/LLDB/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 打印还原符号表的函数调用栈

更多命令用法以及解释请看:chisel wikiDerek Selander开源的工具

四、小结

LLDB调试工具十分强大,以上仅列出了部分用法,日后遇到更好玩的再添加,熟悉以上命令就可以帮助我们快速动态调试,无论在正向或逆向都很提高效率。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335