LLDB使用详解以及断点调试教程

LLDB是一款Xcode自带的断点调试器,绑定在Xcode底部控制台中,iOS开发的同窗平时断点调试确定对下图不会陌生shell

调试命令

控制台断点调试器
在这里咱们会常用 po, bt这样的命令来协助调试,今天咱们来详细讲述一下LLDB的各类命令

help

help是最简单的命令,它会列出全部的命令以及对应的描述.若是你忘记了某个命令是作什么的,你可使用help <command>来查看具体的细节,例如help print或者help expression.express

help命令

print

顾名思义,该命令用于打印值数组

print命令
LLDB会作前缀匹配,你能够直接使用 p代替 print

你可能还注意到了$0,尝试输出p $0 + 10bash

expression

若是在调试过程当中想改变一个值,这时候就须要用到expression命令.同理,你也可使用e代替expression函数

expression命令

其实你在lldb中输入help print会发现,工具

help print命令
expression不一样的是, print命令不须要参数. -- 是用来表示标识的结束和输入的开始.

打印对象

细心的朋友已经发现上面的str打印略微复杂点,实际上咱们尝试打印结构更加复杂的对象的时候,结果可能会更糟post

打印数组
熟悉Objective-C的朋友确定知道咱们想要打印的实际上是对象的 description方法的结果,也就是咱们经常使用的 po(print object的缩写)命令,本质上实际上是 expression -o命令

po命令

打印变量

打印变量

你还可使用p/c或者p/s打印以'\0'结尾的字符串ui

声明变量

声明变量并使用

断点调试

断点调试流程控制
第一个按钮是 continue,继续执行,直到下一个断点,在LLDB中,可使用 process continue达到相同效果 第二个按钮是 step over,执行下一步,若是这行代码是函数调用,不会跳进函数内部,直接执行这个函数, 可使用 thread step-overnext或者 n命令 若是你想要跳进一个函数来调试,可使用第三个按钮, step in,或者在LLDB中使用 thread step in, step或者 s命令 第四个按钮是 step out,若是你跳进了一个函数,想要跳过它, step out能够胜任,该命令会续执行到下一个返回语句

thread return

调试时,还有一个很棒的函数能够用来控制程序流程:thread return 。它有一个可选参数,在执行时它会把可选参数加载进返回寄存器里,而后马上执行返回命令,跳出当前栈帧。这意味这函数剩余的部分不会被执行。这会给 ARC 的引用计数形成一些问题,或者会使函数内的清理部分失效。可是在函数的开头执行这个命令,是个很是好的隔离这个函数,伪造返回值的方式lua

断点

Xcode 提供了一系列工具来建立和管理断点,左侧列表中有一个断点样子的按钮用来查看和管理全部断点spa

断点列表
固然你也能够在LLDB使用 breakpoint list或者 br l命令来查看全部断点列表.单击断点图标能够进行开启或者关闭断点,在LLDB中使用可使用 breakpoint enable <breakpointID>breakpoint disable <breakpointID>命令来进行该操做

咱们能够点击代码编辑页面上的行号进行断点建立,也可使用breakpoint set命令建立breakpoint set -f <filename> -l <line number>,该命令也能够直接使用缩写b,同时也能够直接使用b <function name>建立断点而不用指定哪一行

若是想建立符号断点,能够在下图位置选择第三个Symbolic Breakpoint

选择符号断点
这时候会出现下图的弹出框(该弹出框也能够经过右击Xcode断点弹出)

符号断点编辑
你能够在 Symbol中添加函数 funct,这样每次执行到 funct函数都会进入断点.或者你也能够加入[NSArray objectAtIndex:] 这样的符号断点.这样每次调用这个函数的时候,程序都会中止,不论是你调用仍是苹果调用.

你也能够在编辑断点中添加Condition,操做以下图:

符号断点Condition编辑

上面的例子中,你或许想知道每一次到达断点的时候 i 的值。咱们可使用 p i 做为断点行为.这样每次到达断点的时候,都会自动运行这个命令. 你也能够添加多个行为,能够是调试器命令,shell 命令,也能够是更直接的打印

Automatically continue after evaluation actions勾上以后执行Action以后继续运行程序

在iOS APP中调试

点击Xcode上的暂停按钮或者在LLDB中执行process interrupt命令. 执行po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]命令

视图层次

更新UI

// 获取imageView
e id $imageView = (id)0x7fc40bf1a200
// 改变颜色
e (void)[$imageView setBackgroundColor:[UIColor blueColor]]
复制代码

点击继续运行程序,便能看到变化.由于改变的内容必须被发送到渲染服务中,而后显示才会被更新. 渲染服务其实是一个另外的进程 (被称做 backboardd)。这就是说即便咱们正在调试的内容所在的进程被打断了,backboardd 也仍是继续运行着的.

这意味着你能够运行下面的命令,而不用继续运行程序

e (void)[CATransaction flush]
复制代码

同理你也能够实现push另外一个VC这样的操做. 如有错误,请不吝赐教.

参考资料:与调试器共舞 - LLDB 的华尔兹

关联推荐:LLDB调试加强插件Chisel安装与使用教程

相关文章
相关标签/搜索