LLDB调试工具小技巧

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

  • 我们日常开发每天必要用到了Xcode中的LLDB调试,那么分享一些小技巧调试指令,方便大家调试。

1. 使用expression指令进行动态代码执行

在LLDB调试器中,expression指令可以动态执行代码,可以在运行时修改内存中变量的值,改变程序的运行轨迹。举个例子:

image.png 我们运行打个断点就进入了LLDB调试模式。
LLDB指令区输入指令,按下回车执行

image.png 输出的内容中,int表明了变量的内容,$0是LLDB自动生成的一个临时符号,表示变量a的值为10,我们也可以直接修改变量

image.png 继续执行,最终控制台打印32

image.png 实际开发中,我们知道程序某个地方可能出现问题,为了找到解决方法,不使用LLDB调试器时,可能需要在代码中添加大量的打印函数,并且多次修改源码才能解决问题。如果使用LLDBexpression命令,不仅不需要添加额外的打印代码,可以不需要直接修改代码。在调试区进行多次调试,知道找到正确的修改方法后再对源码修改一次即可。

2. 使用frame指令查看代码帧信息

frame指令时LLDB中非常强大的一个调试指令,可以通过它查看当前代码帧信息,查看函数名称,参数和所在位置信息,并且可以进行代码回遡调试。
我们在ViewdidLoad中执行下面代码,并添加断点

image.png Xcode导航区可以看到当前线程与数据帧信息,程序当前最上层的数据帧块为test:函数执行所在的帧,没一个帧块前面都有一个数字标号,在LLDB中可以通过这个标号来切换要查看的数据帧信息。
在LLDB调试区直接输入指令:frame info

image.png 主要包含当前所在的数据帧编号为0,内存地址,执行的函数名,所在代码文件位置和行数。
我们也可以输入 frame variable来获取当前数据帧中变量信息

image.png

  • 值得注意的是上面的expression命令只能操作当前数据帧中的变量,在viewDidLoad方法中定义的变量a,b.无法在当前数据帧中访问,但是实际开发中,我们在调试代码时候经常会需要进行数据回溯,比如test函数传递进来的参数是在viewDidLoad中计算的,如果计算失误,我们要回溯到viewDidLoad函数检查。

使用指令:frame select [count] 上面count为对应数据帧的编号,我们可以用之前的frame info 查看对于数据帧的编号点击导航栏左边对应方法打印它的信息 image.png 我们输入frame select 1

image.png 如果不使用LLDB工具,遇到这种情况,我们往往会打多个断点,一步步追溯代码运行的过程并检查过程中变量的值是否正确,不小心错过的话又要重新开始,使用frame数据帧就可以十分方便解决。

3.使用thread相关指令操作线程

应用程序运行过程中,可能会开启多个线程,每个线程包含多个数据帧块。使用thread相关指令可以查看程序中开启的线程,在LLDB调试区使用thread backtrace 查看当前线程中所有数据帧:

image.png 之后使用上面的frame相关指令来查看某个数据的具体内容。
也可以使用thread list 查看所有被激活的线程:

image.png 使用thread info 查看当前正在调试的线程信息

image.png 同样我们也可以切换调试的线程:thrad select [count] 还有一些相关的thread指令可以在LLDB中控制程序的执行,continue可以跳过当前断点向下执行,使用jump可以跳转指定的内存地址等。

4.其他的LLDB常用指令

除了上面的LLDB还可以直接添加断点,控制断点行为,反编译代码,读取内存二进制等。使用help指令进行查看,比如 help thread

image.png

help frame

image.png 还有一些常用的指令,print指令可以对变量进行打印,使用r指令可以重新运行程序,quit指令结束LLDB调试等,感兴趣的可以通过help查看更多高级功能。

猜你喜欢

转载自juejin.im/post/7018722857869901832