使用XCode调试,笔记


 

设置debugger的布局

可以通过Run > Debugger Display > Horizontal Layout设置成水平布局,这是xcode 的默认布局,也可以通过Run > Debugger Display > Vertical Layout来设置成垂直布局。区别在于,垂直时,位于原来中间的代码区移到右边。相对原来的,我更喜欢垂直布局~

水平布局

 

垂直布局

 

查看全局变量

Variable中现实了当前的变量的值,类型等等。其中有一个Global组显示了当前的全局变量。默认为空,我们可以通过Run > Show > Global Variables来选择要显示的全局变量。

设置断点

断点非常有用。按照作用范围,xcode 包括2类断点。一种是Project Breakpoints,另一种是Global Breakpoints。如下图:(可以通过 Run > Show > Breakpoints 来显示)

 

 两者的区别在于,Project Breakpoints只作用在当前的project中。而Global则是作用在当前用户的所有project中。

按照类型分,xcode 包括4种类型的断点:

  • File Line :运行到文件的某一行触发
  • Symbolic:按照特定的条件触发
  • Objective-c exception: 抛出OBJC异常时触发
  • C++ exception:抛出C++异常时触发

每一个断点前的小三角可以打开一个设置关联这个断点行为的窗口。比如说声音,applescrpit等等

每个断点前的图标如果是个文件(

)的话,表示这个断点是File Line或者C++ exception,如果是蓝盒子(

),则是Objective-c exception或者是Symbolic

最右面的方形选择框有点特别,如果选择了这个框,那么xcode 会停在断点处,运行预先设置好的事件,然后自动继续运行程序。如果没有选,那么xcode 停在断点处后,先运行设置好的事件,然后等待用户决定是否继续运行。

Condition处可以设置这个断点的触发条件。比如说 i==24表示当i等于24时这个断点才会被触发。而Ignore Count处则是设置这个断点处被忽略多少次。比如说这里如果设置成5, 则表示第六次遇到这个断点时才触发。

如何设置断点

设置一个File-Line断点。

这个比较简单,只需要在那一行前点一下,出现一个箭头。 如:

 

设置Symbolic断点:

有以下两种方法:

  • 选择要设置的那一行,然后Run>Manage Breakpoints>Add Symbolic Breakpoint, 然后输入方法或者函数名
  • 打开断点窗口,双击”Double-Click for Symbol”,然后输入触发时的函数路径。

比如说我们可以设置为 -[NSException raise], 这样当调试时遇到NSException的异常时自动中断。

给@Synthesize 设置断点:

有时候可能需要知道什么时候,什么情况下读取或者修改了某个成员变量的值。因此我们需要给这个成员变量设置一个断点,当调试时,每次遇到读取或者修改这个成员变量,就触发这个断点。

设置的方法非常简单。只需要在那个变量的@synthesize那一行按照file-line的断点设置一样设置一个断点,当运行调试时,会自动弹出一个窗口,询问你要对setter还是getter还是这2者设置断点。如下图:

 

需要注意的是,如果修改了变量名,必须要重新设置一遍。

添加Objective-C Exception Breakpoints

这个功能相当有用。设置起来出奇的简单。选中菜单Run>Activate/Deactivate下的Stop on Objective-C Exceptions. 如图:

使用预定义的breakpoints.

XCode里已经预定义了很多的breakpoint模版。在想要设定的代码行前右键,Built-in Breakpoints,

预定义的breakpoint写的很清楚明白。

  • Log breakpoint and arguments and auto-continue:  打印当前的函数的参数并自动继续执行。
  • Log beakpoint and hit count and auto-continue:  打印出当前断点已执行过的次数并继续执行。
  • Log stack trace and auto-continue:  打印当前的堆栈调用,并继续执行。
  • Sound out and auto-continue: 响一声并接着执行。
  • Print self and auto-continue: 打印当前函数所属的类,并继续执行。
  • Speak breakpoint and hit count and auto-continue:  读出断点,次数并继续执行。