LLDB调试命令

作者: KinKen | 来源:发表于2018-12-16 23:05 被阅读71次

一、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 程序继续执行
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

(三)一些常用命令用法

1.pviews

打印当前界面结构和ViewController,如果出错,先导入UIKit,类似于Cycript。

2.presponder address

打印控件的响应链,参数为控件内存地址

3.pactions address

打印控件的action事件,参数为控件内存地址

4.pblock address

打印block的信息,IMP地址、签名,参数为block地址

5.methods address

打印控制器的所有方法以及对应的内存地址,参数为控制器地址

6.search UIButton

搜索当前界面下的所有UIButton类及其子类,其他控件同理

四、小结

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

相关文章

  • LLDB 使用

    LLDB 使用 LLDB(Low Lever Debug)命令结构 其中: (命令)和 (子命令):LLDB调试命...

  • iOS LLDB调试

    掌握以下lldb命令,够用. ### LLDB调试总结 eNSString*$str=@"test"...

  • 各种调试技巧

    断点调试并配合LLDB常用调试命令LLDB命令详见:http://www.jianshu.com/p/d14a25...

  • iOS之LLDB常用调试命令

    iOS之LLDB常用调试命令熟练使用 LLDB,让你调试事半功倍使用facebook开源的Chisel调试Home...

  • iOS开发技能之lldb常用命令

    lldb命令调试 首先我们创建一个简单工程来调试这些命令。打断点,下方就可以进行lldb调试。 p & po po...

  • LLDB调试命令初探

    LLDB调试命令初探 初识LLDB 你可能从未使用过LLDB,那让我们先来热热身。 在调试器中最常用到的命令是p(...

  • 【LLDB】高级运用与深入理解

    摘要 如何在调试中高级运用调试方法,减少重新运行 LLDB获取帮助 调用help命令来列出LLDB所有的顶层命令 ...

  • 知识点-LLDB调试命令

    lldb是我们平时在打断点时候,打印面板出现的。 lldb是Xcode自带的调试工具,下面是常用的lldb调试命令...

  • LLDB命令调试与断点调试

    [LLDB命令调试与断点调试] https://my.oschina.net/notting/blog/11529...

  • LLDB 命令和调试(一)

    LLDB 命令和调试(一) 为什么要学习 LLDB 调试 对于我们程序员来说,构建调试几乎是每天必做的工作。 你是...

网友评论

    本文标题:LLDB调试命令

    本文链接:https://www.haomeiwen.com/subject/dcnxkqtx.html