在这次的学习lldb之前,一直在用一些lldb的命令而不自知,比如po命令,这个命令的作用是打印变量的信息(调用变量的description方法),这个方法给调试带来了很大的便利,如果没有这个命令,就只能频繁的写NSLog方法,而且还要重新编译运行,而使用po命令就不用编译运行了。
我在这里只介绍一些我常用的一些命令,一些其他的使用技巧可以参考下面的引用。
expression
这个命令的作用是在当前线程执行表达式,并展示返回值,前面说到的po命令其实就是这个命令的别名版本,它的原始写法是expression -O --
如果你嫌拼写太长也可以这样写e -O --
不过使用这种方式需要注意下不要和别的命令重名,比如 p 是打印变量信息,它的全称是print,但是你不可以使用pr,因为process也有pr前缀
这里还有一个非常好的用法,可以在运行时动态的改变界面,方便你的调试,
平时调试界面的时候,如果要改变界面的元素的样式,每次都要编译,重新运行,有了这个功能可以大大缩短调试的时间,太棒了。
breakpoint
断点应该是我们最常用到的功能,breakpoint命令可以方便的设置断点
breakpoint set --name someMethod // 在方法名为someMethod的地方设置一个断点,这个断点是全局的,且不管是你调用的还是系统调用的都会停留在这个断点这里
还可以根据行数设置断点
br s --file test.m --line 12 // --file是文件名选项 --line 是行选项
列出全部断点
br list //展示所有的断点
删除断点
br delete 1 // 删除断点,delete 后面的加的数字是断点的id,在上面的br list可以看到所有断点的id
还可以设置条件断点
br s --file test.m --name someMethod: --condition 'flag == YES' // --condition 条件断点的选项 flag是someMethod参数的名称
watchpoint
这个命令的作用可以观察实例变量的变化,当你想监听某个变量的时候,你可以这样写
watchpoint set variable btn // btn就是你需要监听的实例变量
Thread Return
这个函数可以用来控制程序流程,比如你在调试类似以下函数的时候
- (void)someMethod:(BOOL)flag {
if (flag) {
return YES;
}
return NO;
}
你在某处调用了[self someMethod:YES]
,但是当你在调试时你又想查看flag参数为NO的情况,如果在没有lldb的情况下,你不得不更改参数值为NO,然后再重新编译运行。但是有lldb,你可以这样做,在if (flag) {
这行代码处设置一个断点,当程序执行到这里的时候,在控制台中输入以下命令
thread return NO
即可返回NO,并立即返回到[self someMethod:YES]
处,是不是很酷😎
chisel
chisel其实就是一个Python脚本的集合,它封装了很多好用的命令,比如caflush它就是封装了e [CATransaction flush]
,还有很多其他的命令。在初次安装使用chisel时,有一点需要注意一下,在高版本的macos系统中,加载过程中会出现问题(我的系统版本为10.15),这时仅需在命令行工具中输入以下命令即可解决
defaults write com.apple.dt.lldb DefaultPythonVersion 2
总结
这里只是简单介绍了lldb的用法,在实际的使用过程中掌握以上的命令即可为开发调试节省很多时间,当然,还有很多的其他命令可以使用,比如frame、thread、process等等,这些就需要你去自己探索了。