Xcode LLDB断点调试

LLDB是高性能的程序调试器,当Xcode触发断点时,程序会自动进入LLDB调试环境,开发者可以在控制台进行LLDB指令的执行。

1、expression指令进行动态代码执行

在LLDB指令区输入查看内存中变量或内存的值,同时也可以修改相应的变量值,这样就不需要我们在代码中添加大量的打印函数,和修改源代码。

image.png
//xcode断点控制台输入
(lldb) expression c
(Int) $R0 = 3
(lldb) 

从这里我们可以看到c的值为3。
当然如果a是可变类型,我们也可以直接修改a的值,这样c的值就变为12了

(lldb) expression a=10

2、frame指令查看代码帧信息

frame指令是LLDB中非常强大的一个调试指令,开发者可以通过它查看当前代码帧信息、函数名称、参数和所在位置信息,并可以进行代码回溯调试。

image.png

还是前面的代码,当我们断点时,我们在Xcode的导航区可以看到当前的线程和数据帧信息.
从上图中我们可以看到,程序当前的最上层数据帧块为 lldbTest 函数执行所在的帧,每一个帧签名都有一个数字标号,在LLDB中可以通过这个标号来切换要查看的数据帧信息。

下面我们来进行调试:

frame info调试

//xcode断点控制台输入
(lldb) frame info
frame #0: 0x0000000101004388 LLDBDemos`ViewController.lldbTest(self=0x000000010160f6d0) at ViewController.swift:22:15
(lldb) 

从上面的代码我们可以看到,当前所在的数据帧变化为0,内存地址为:0x0000000101004388,工程名为:LLDBDemos,所执行的函数为ViewController类中的lldbTest函数,函数中的参数也被分别列了出来并标明了代码所在文件位置和行数。

frame variable调试获取当前数据帧中的变量信息

frame select [count] 访问对应的帧,进行代码回溯的时候使用。

3、thread相关指令操作线程

在应用的运行过程中,可能会开启多个线程,从上面模块的图片中我们可以看到,每个线程中又包含许多个数据帧块。使用thread相关指令可以查看程序中开启的线程,并可以进行线程切换调试。

使用thread backtrace 查看当前线程中所有的数据帧(数据帧较多,就不全部截图)

image.png

使用thread list查看当前所有被激活的线程,在输出的线程中 *标记了当前正在调试的线程

image.png

使用thread info可以查看当前正在调试的线程信息

image.png

同样我们也可以切换线程 thread select [count]

image.png
还有一些其他的命令,比如continue 可以跳过当前断点往下执行,jump可以调到指定的内存地址等。

4、LLDB其他常用指令

LLDB调式功能十分强大,指令也非常多,出了常用的功能外,其实还可以直接添加断点、控制断点行为、反编译代码、读取内存二进制数据等。help指令提供了帮助文档,例如要查询thread相关指令,可以使用如下指令:

help thread

还有一些常用指令,如使用print进行打印,使用r可以重新运行程序,quit指令结束LLDB调试等。

你可能感兴趣的:(Xcode LLDB断点调试)