快速入门iOS程序员iOS Developer

Xcode 调试之 LLDB

2017-05-17  本文已影响190人  花与少年_

LLDB 是 Xcode 中的默认调试器,支持调试 C、Objective-C、C++,用 LLDB 调试代码的好处不必多说,基本 Xcode 中常见的调试方式 LLDB 都支持,但 LLDB 还可以在运行时写和运行一些简单代码、运行 Python 代码来扩展调试的方式。

LLDB

现在让我们来总结写 LLDB 都有哪些调试方式吧~

打印

我们最常用的可能就是进行打印操作,在打下断点,程序暂时停止,在 console 中写命令打印一些变量的值:

Help

Breakpoint

可以直接用写命令的方式打断点、调试、编辑断点信息:

在断点停下后,还可以像按这些键一样,调试断点:


调试断点

Expression

expr + OC 代码,在运行时可以执行,对于输出一些运行时才会确定的变量十分有用。

在ViewController出现时,给这个断点添加一个行为

给断点添加了一个行为,执行 expr 后面的方法,然后 continue。
这样每次在ViewController出现时,会执行这个 segue ,推出后面的 Controller,如图:

每次蓝色的VC出现时,会执行segue,弹出黄色的VC

Backtrace

Thread

可以操作线程,显示当前线程信息,在运行时,直接改变方法调用的返回值

Frame

运行时直接查看变量的值

Watchpoint

当变量变化时,程序暂停,显示 watchpoint 的变化

Script

lldb 内置了 Python 的脚本解释器,可以解释运行 Python 代码

给断点1添加简单的python代码,每次停下来时,会执行这段代码

Command

示例:

  1. 新建一个 empty 文件,文件后缀名为 py,内容为:
def print_locals(frame, bp_loc, internal_dict):
    variables = frame.GetVariables(False,True,False,True)
    for i in range(0, variables.GetSize()):
        variable = variables.GetValueAtIndex(i)
        print variable

大概意思为,定义一个方法,会将当前的变量一个一个打印下来
frame 指当前堆栈信息,bp_loc 指断点的具体位置,internal_dict 这个python 文件的一些参数信息

2.导入 python 代码
3.给断点加入 python 代码中定义的方法
如图所示:


调试断点时,使用一段已有的 python 代码

Alias

当遇到较为复杂的命令,可以给这些命令定义一个别名,每次调用别名即可。

给 expr 命令加了一个别名 pf

上面的方法存在一个问题,设置的别名只在当前运行过程有效,下次就失效了,怎么持久化呢?
可以将这些命令封装起来,保存在电脑中,每次调试时都可使用。

2.重启Xcode,再次编译运行
3.打断点,并输入 pf

这一次只要 .lldbint 文件存在,pf别名就一直可以使用

Chisel 是 Facebook 开源的一款 lldb 命令集合文件,GitHub 地址。我们可以直接使用一些定义好的 lldb 命令来调试程序。
安装十分简单,确保 Mac 已经安装了 homebrew 环境
$ brew update
$ brew install chisel
安装成功后会出现

安装成功
并且提示要将框中出现的命令加在刚刚生成的那个 .lldbint 文件中。
重启 Xcode 之后,每次就可以使用这些命令了。
在 lldb 中输入 help,我们发现最下面出现了一些用户自定义命令,这就是 Chisel 中的。
比较常用的有border,给视图加边框;hide,隐藏视图;mask,给视图加遮罩;presponder,显示响应者链……

关于 Xcode 调试的文章先总结到这里,希望以后能继续补充完善🤖

参考文章
Xcode LLDB Tutorial
The LLDB Debugger
Dancing in the Debugger — A Waltz with LLDB

上一篇下一篇

猜你喜欢

热点阅读