Xcode上手之调试程序
Xcode技巧系列:http://www.jianshu.com/notebooks/7639304/latest
1 静态分析
Xcode集成了Clang静态分析器,该分析器能够分析源代码,因为无需运行,即可对代码本身进行分析,所以称为静态分析器。
1.1开启
菜单栏Pruduct->Analyze即可开启分析操作。找到问题后,会在问题导航器中标记出来,如图:
屏幕快照 2017-02-21 下午9.52.25.png分析器能够分析出来的问题有:
- 逻辑错误
- 内存泄漏
- 死存储问题
- API问题
逻辑错误
逻辑错误可能会造成程序奔溃,比如OC中,使用了未初始化的变量等。使用静态分析器可以很方便的找出。
内存泄漏
内存泄漏,就是程序丢失了某个对象的引用,因而它不会被释放内存,该内存无法读取也无法写入,该对象一直占用着内存空间可能导致程序奔溃。
静态分析器可以有效的找出内存泄漏问题。
死存储问题
代码中不会被访问的变量,这种问题是无法通过编译找到的,需要通过分析器来寻找。
API问题
由于没有遵循项目中所使用的框架或者库的要求而导致的。
比如在viewWillDisappear方法中,未使用[super viewWillDisappear],该问题只有通过分析器查找到。
2 断点调试
断点类似于中断,当程序运行到断点所在位置时,Xcode会暂停程序运行,保护此时程序的数据,等待开发者的调试指令。
2.1 使用
通常情况下,在代码左侧的边列中点击即可添加断点。
屏幕快照 2017-02-21 下午10.14.00.png程序运行到此处会暂停。想取消,再次点击。拖动到空白处即是删除断点。
2.2 控制断点
右键点击断点,即可对断点进行控制和管理。
屏幕快照 2017-02-21 下午10.17.42.pngEdit Breakpoint:编辑断点
Disable Breakpoint:断点失效
Delete Breakpoint:删除断点
Reveal in Breakpoint Navigator:在断点导航器中显示
2.3 断点设置
点击Edit Breakpoint即可进入断点设置,如图:
屏幕快照 2017-02-21 下午10.22.54.png- 第一行:断点所处文件和行号,勾选或取消复选框,可以激活或失效断点。
- 第二行:条件表达式,可以输入触发条件。当程序执行到此处时,会运行输入的条件表达式,如果为YES,则暂停程序。
宏不能够识别!也无法识别断点作用域之外的变量和方法!
如果不满足,则继续执行程序,忽略断点。 - 第三行:忽略断点的次数,超过后,断点执行。
- 第四行:指定断点触发时,Xcode的行为。可以执行特定的脚本或者一些动作。
- 第五行:如果勾选,表示在遇到断点时,执行该断点中的动作,而不再暂停应用,继续执行。
在断点导航器下方,还可以通过+添加别的类型的断点:
屏幕快照 2017-02-21 下午10.38.02.png
- Swift Error Breakpoint:swift错误的断点
- Exception Breakpoint:异常断点,只有发生异常时,才会暂停程序运行。
- OpenGL ES Error Breakpoint:只有在OpenGL ES错误发生时触发。
- Symbolic Breakpoint:中断某个方法的调用,只要出现这个方法调用的地方,都会引发断点触发,从而暂停程序。
- Test Failure Breakpoint:只有在测试断言失败的时候才会触发执行,这时,应用会暂停在引发测试失败的代码处。
2.4 调试区域
调试区域如图:
屏幕快照 2017-02-21 下午10.47.53.png调试工具栏,区域①
如图所示最上面区域,有很多按钮,控制应用的运行。从左到右依次是:
- 隐藏/显示调试区域
- 启动/关闭所有断点
- 继续/暂停进程
- 单步跳过执行
- 单步跳入执行,跳入函数内部
- 跳出当前函数
- 调试试图层次,打开试图调试功能
- 调试创建过程
- 地理位置模拟
变量试图,区域②
显示当前程序暂停处,存放在堆栈中的变量和寄存信息。可以根据需要选择显示的变量内容:
屏幕快照 2017-02-21 下午11.01.23.png
- Auto:显示与当前作用域相关的变量
- Local Variables:显示当前作用域下的局部变量
- All...:显示所有变量
小眼睛:快速查看。
叹号:打印描述信息。
Filter:可以过滤复杂的信息。
控制台,区域③
用于输出应用打印内容。
下方可以设置输出内容:All Output所有,Debugger output调试器输出,Target Output对象输出。
3 LLDB调试
我们前面的调试,实际上都是使用LLDB命令,只是Xcode界面封装过了。只有在程序暂停时才可以使用LLDB命令。
屏幕快照 2017-02-21 下午11.35.24.pngLLDB命令只能读取当前作用域下的变量信息。
3.1 po
打印对象信息,对应于:print object。
格式:po 对象
3.2 p
打印值。
格式:p (类型)表达式
p (NSInteger)[view.description length]
3.3 expr
expression命令,动态执行指定的表达式,并将结果打印出来。
expr view.tag = 3
更多的指令,输入help即可查看列表,help 命令,会列出指定命令的所有子命令。
结语
其余的调试方式,比如UI界面,性能调试等,由于使用比较少,就不说了。