iOS-LLDB调试-整理

iOS-LLDB调试-整理_第1张图片
简单图解

在 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命令来发现更加多的新大陆~

你可能感兴趣的:(iOS-LLDB调试-整理)