iOS-LLDB调试-整理
2016-04-27 本文已影响209人
MonsterNanny
简单图解
在 LLDB 命令行中,对于每个流程控制按钮都有相应的命令。
-
n
命令, 代表Step Over
操作。 -
s
命令, 代表Step Into
操作。 -
finish
命令,代表Step Out
操作。 -
c
命令, 代表恢复程序执行操作。
Po 打印变量
Po 变量
expression 修改变量
e 变量 = 0
thread return 线程返回
不但可以使当前的函数返回,而且还可以任意修改当前函数的返回值,而不管传进来的参数如何。
-
比如我们有这样一个函数:
func add(a:Int, b:Int) -> Int {
return a + b;
}
如果断点进入这个函数体的时候,我们执行了
thread return 3
命令,那么不管这时候传进来的两个参数是什么,这个函数都会退出执行,并返回我们指定的值 3。
打印UI所有层级属性
po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
每个视图的标识中,都有一个 16进制的字符串,代表这个视图的 ID,比如这个:
UIView: 0x7ffcd2c6dc10
这个 ID 的作用非常的强大,得到了这个 ID, 我们就可以通过这个命令来得到这个视图的引用了:
(lldb) e id $view = (id) 0x7fbd71432590
简单解释下,通过
expression
命令(这里用缩写形式e
),我们用 View 的 ID 值取得了这个 View 引用,并将它保存到$view
变量中。
我们得到了引用之后,就可以对这个视图进行很多的操作了,比如我们可以在运行时改变这个视图的背景色:
(lldb) e (void) [$view setBackgroundColor:[UIColor redColor]]
当然,我们运行完这条命令,界面上不会马上反应出来,我们还需要调用这个命令刷新一下:
(lldb) e (void)[CATransaction flush]
关于 Chisel
最后,再给大家延展一下。LLDB 本身的命令系统非常健壮,并且它还支持 Python 的脚本扩展,这样它又有了很不错的扩展性,我们可以根据自己的需要来扩展自己的脚本。
Chisel 正是 LLDB 扩展的一个典型例子,这是由 Facebook 团队开发的一个开源的 LLDB 的 Python 扩展集合,它再 LLDB 命令的基础上,又为我们提供了更加方便的操作接口。
-
比如我们要打印当前的视图层级,如果用 LLDB 原生的命令,我们需要这样:
(lldb) po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
-
而 Chisel 为我们提供了更简洁的接口:
(lldb) pviews
-
同样的,这条用于刷新显示的命令:
(lldb) e (void)[CATransaction flush]
-
Chisel 也为我们提供了简便的接口:
(lldb) caflush
关于 Chisel 的更多内容,大家可以参看它的主页:https://github.com/facebook/chisel
LLDB 自身完善的命令行系统,以及它的扩展能力,都成为提升我们开发效率的利器。正确的使用好调试工具,一定会帮助我们快速的解决更多的问题。
想探索更加多LLDB命令行, 可通过help
命令来发现更加多的新大陆~