程序员每天接触最多的就是对象(自己主动New的)和bug,而在开发中掌握一些调试技巧是很有用的,今天工作中遇到了一个bug搞得心好累,晚上就写一点自己调试中会用到的方法。
Apple的编译器是LLVM,编译器在开发中会帮助我们很多,就像内存管理现在我们可以设置编译器的ARC为有效状态,这样我们就在也不用像原来那样苦逼的进行内存管理了。
所以就先讲一个和编译器有关的调试技巧
一.LLDB调试命令
LLDB是LLVM下的调试器,Xcode从4.0开始编译器开始改用LLVM,相应的调试器也从gdb改为LLDB。而从 Xcode5.0开始所有工程也被自动设置为使用LLDB(我是没接触过gdb)
我们可以通过一些LLDB命令来帮助我们调试。
首先怎么调试:在项目中打个断点我们就可以看到:
在箭头指向的位置我们看到了lldb,这样我们就可以输入指令:
- po---最常用的,po是一般是输出 Objective-C 对象的,p是输出基本类型的,但是我们发现其实都可以用。(注意输出的信息中带有$1的字样。实际上,我们每次查询的结果会保存在一些持续变量中($[0-9]+))这样你可以在后面的查询中直接使用这些值像这样:
(lldb) po $1
dongdong
-
expr---可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值
-
call--即是调用的意思,如call age=18,也会改掉值
4.bt------打印调用堆栈,加
all可打印所有
thread的堆栈
5.image-----
mage 命令可用于寻址,有多个组合命令,如image lookup --address寻找栈地址对应的代码位置
(当碰到给一堆堆栈错误时很有用)image lookup --type(找到匹配的类型,感觉多数情况下都没用)
lldb命令还有很多,但是在iOS开发中我常用的就这么几个,下面介绍一下lldb命令和断点的一些使用
二。断点
在断点中我们可以进行一些编辑,从而让其达到我们的需求,使用方法可以在断点上双击进入第一个选项,或者commond+option+单击就可以进入编辑状态
1.lldb命令和断点的结合
当我们把底下的options打钩时,意味着
运行到这个断点的时,填充变量的值,然后继续运行,并不在此处断点进入调试模式,我们看到输出已经改变了
2.条件断点
conditon中的意思是只有符合这个条件时断点才有作用。
总结:断点和lldb的知识其实很多,我们在开发中了解其常用的方法和合理使用会大大的促进我们的开发速度和提高效率。