Xcode调试技巧

断点

Xcode支持很多种不同类型的断点,包括普通断点、符号断点、异常断点、watch断点、OpenGL ES Error 断点和Test Failure 断点。(后两者不常用)

普通断点

下普通断点很简单,找到你要下断点的代码行,点击编辑区左边的行数处即可;或者使用快捷键直接command + \

特点: 当程序运行到此处的时候将会暂停

符号断点

符号断点其实就是对一个特定的函数/方法名下断点,在导航区选择断点tab页 -> 点击最下面的加号 -> Add Symbolic Breakpoint

设置符号断点可以输入类名+方法名,也可输入方法名,Xcode会自动匹配在不同类中同名的方法进行断点。

特点: 一旦所填写的方法被调用,就会暂停。

异常断点

异常断点在调试时如果程序抛出异常,导致程序退出,就会暂停。导航区 -> 断点tab –> 左下角加号 -> Add Exception Breakpoint

特点: 一旦程序异常就暂停,能立马定位问题,为比较常用的一种断点。

watch断点

watch断点就是当某个变量发生改变的时候触发的断点。在Xcode的watch窗口-> 右键需要watch的变量 -> watch “XXX”

当所watch的值发生变化时调试器会自动暂停。并打印信息

特点: 当要观察某个值是否发生变化,可使用watch断点

其他断点(不常用)

OpenGL ES Error Breakpoint 以及 Test Failure Breakpoint
OpenGL ES Error Breakpoint :主要是OpenGL ES的断点调试
Test Failure Breakpoint :这个类型的断点会在test assertion 失败的时候暂停程序的执行。

编辑断点

右键普通断点 -> Edit Breakpoint 添加条件

断点的属性以及说明

属性 说明
Condition 输入条件表达式,满足条件的时候断点就会生效。
Ignore 在这里可以设置忽略断点次数。
Action 一些断点触发时的操作。
Options 勾选Automatically continue after evaluating actions之后程序会在断点产生后继续运行。

断点后的action

断点后的action,其实就是当断点被触发可以执行一些操作。右键断点 -> Edit breakpoint -> Add action

Action的类型很多,有Debugger Command、Log Message、Apple Script、Shell Command等,常用的有Debugger Command和Log Message


Action对于调试是非常有用的,比如你需要在断点的地方频繁打印某一对象时,你不用新加log,然后重新编译,直接加一条Debugger Command就可以,下图为打印self.string信息

用于action的Debugger Command常用命令

po命令 : 打印对象信息

expr命令:可以在调试时动态的执行表达式,同时打印出结果。常用来动态修改变量的值。

call命令 :动态调用函数,可以在不增加代码,不重新编译的情况下动态调用一个方法。

UI调试

控件信息

可以使用上述的po命令以及expr命令来查看、修改控件属性。

快速预览

Xcode5之后支持在调试时对变量进行快速预览,调试时将鼠标放在变量上,然后点击快速预览按钮即可看到控件的显示。

查看整体UI层级结构

点击在Xcode的watch窗口上方的debug view hierarchy 按钮

之后便可以观察当前应用窗口的层级结构

注意:在面板底部左侧有两个按钮。如下图所示,取消对这两个按钮的选定,否则会隐藏一些视图。

探索视图层次

对于如何查看某个视图,可以选定查看的视图,然后观察跳转栏(Jump Bar)比如当选定最底部的视图,则Jump Bar显示

当各个视图之间间距太小,可以使用左下方的slider来控制视图间的间距.
同时若滚动右下方的滑块,则可以隐藏不同层次的视图

查看视图

按下cmd + 6 调出导航栏的Debug navigator,选定要查看的视图。或者直接在编辑区选定。

接着使用cmd + option + 4打开工具区的Size Inspector,便可查看该视图的边界、位置、锚点以及Auto Layout约束列表。

也可以通过cmd + option + 3切换至Object inspector。你会看到一个选定对象的各项信息,比如背景颜色,tag等等。

参考

本篇为作者认为常用的一些调试方法,若想深入了解,可以查阅以下参考文档。其次若有不足可以指出、探讨。

Xcode基本使用及调试技巧
只会左键断点?是时候试试这样那样断点了
breakpoints、lldb 和 chisel 的详解
详解Xcode 6的视图调试

听说你想请我喝下午茶?😏
------------------ 我是有底线的 ------------------