LLDB是个开源的内置于XCode的具有REPL(read-eval-print-loop)特征的Debugger,其可以安装C++或者Python插件。
expression 命令
expression
命令是执行一个表达式,并将表达式返回的结果输出,是LLDB调试命令中最重要的命令,也是我们常用的 p 和 po 命令的 鼻祖。
他主要有2个功能:
执行表达式
举例:改变视图背景颜色(无需改变xcode中的项目文件代码)
- 输出返回值
衍生出的扩展命令 p & print & e & call 命令
po 命令
oc里所有的对象都是用指针表示的,打印出来的是对象的指针,而不是对象本身,可以采用 -o 来打印对象本身 为了更加方便的时候,LLDB为 “expression -o —” 定了一个别名 :po
更多 expression 命令 可自行通过 “help expression” 命令获得
target命令
大伙经常做项目都知道,iOS程序崩溃,很多都是因为 数组越界 访问野指针 适配布局语句不合法 版本系统兼容 等原因造成的,但遇到多人协同开发的项目,遇到崩溃问题,有时候往往我们不能最快的定位到项目崩溃的代码位置,因为很多代码不是我们本人写的, 我们尝试了 为 xcode 设置全局断点的方法,来获取代码崩溃的位置,但这种方法,只有60%的成功几率。
假设我们尝试了之前寻找崩溃的方法都不管用,还好我们可以使用 LLDB命令行来调试
我们运行这样一段代码
很明显是一个数组越界的语句,运行结果,程序直接crash
我们看一下崩溃日志,发现看到的都是一些 地址之类的相关信息,不知道这些地址有什么作用,其实这些地址非常有用,我们分析一些 堆栈帧 ,记住找到 崩溃帧所在的前一帧的地址
当我们有一个地址,想找到具体地址对应的文件的位置的时候,可以使用 target modules lookup -a
随着LLDB版本的更新,target modules
又可以简化为 image
所以 target modules lookup -a
可以写为 image lookup -a
我们尝试一下这个命令
发现LLDB帮我们定位到代码崩溃在了 VIewController这个文件 textLLDBCrash 这个方法里,具体代码在 46行,对照图一中 数组越界的代码行数就是 46行,一点没错。
thread 命令
thread return
Debug 阶段,有时候我们因为某些原因,不想让代码执行某个方法,或者想直接返回一个想要的值,这个时候 可以使用 thread return