断点是最基本的调试技巧之一。很长一段时间内,我都觉得断点毫无技巧可言,随着接触愈深,才发现自己真是“too native sometimes native”!

如何在Xcode里面加断点,以及Step over、Step into等等就不啰嗦了,直接说说其他用法。

自定义断点

Xcode中,断点右键,选择“Edit Breakpoint…”,可以看见如下的视图:

  1. Condition:条件断点,用来对付遍历或者循环相当有效
  2. Ignore:忽略前多少次的断点
  3. Action:断点时执行某种操作。右面的“+”“-”可以添加删除其他操作。点开下拉框,一共有六种操作可以选择

    • Debugger Command:Debugger指令,提示可以填入“po foo”之类的指令。Debugger指令高深莫测,具体等以后总结GDB和LLDB时再详细讲讲
    • Log Message:日志输出,一些特殊的日志规则也都有提示。(日志输出可以选择语音哦,识别率很高声音很性感哦)
    • Shell Command:Shell指令,没有具体尝试过,估计对于自动化测试很有效果
    • Sound:声音,和语音日志输出一样,就是用来调戏用的
    • 其他两种,目前没有应用场景,先占位
  4. Options:勾选可以选择执行后自动跳过。话说自动跳过的断点有什么用,其实是用来配合上一项“Action”的,这两项配合得好的话,必杀技无疑了

更多类型的断点

断点的导航视图(快捷键Command+6),详细标明了程序里的断点信息。除了第一种之外,还有两种:异常断点和符号断点,如下图。具体可在左下角的“+”添加。

异常断点(Exception Breakpoint)

假如我们执行下面的代码:

1
2
3
4
NSArray *array = [[NSArray alloc] init];
NSObject *i = [array objectAtIndex:0];
NSLog(@"%@", i);
[array release];

会直接崩溃到main函数数并报异常。虽说可以知道是什么异常,但没法立刻知道具体是哪里抛出了异常,这时,添加一个异常断点就十分有效了。

添加一个异常断点。“Break”选择“On Throw”,再次运行代码,就可以在第二句代码处抛出异常时断点。

符号断点(Symbolic Breakpoint)

假设此时需要断点在非自己的代码的函数里面,这一项就发挥作用了。

  1. Symbol:符号,假如断不到点,可以先确定下是否格式写错了
  2. Module:模块,限制范围用的
  3. 其他选项的和之前的相同

GDB和LLDB

学好GDB和LLDB很重要,在控制台调试程序,给人的感觉就如同大家都在用IDE写代码的时候,你在用记事本敲代码。

GDB和LLDB有很多断点类的指令,具体指令可以看这里,就不解释含义了。

可以说下我的某次应用场景:某种操作下,UIWebView的弹出键盘被莫名其妙地缩回去了。代码里面所有的显示调用resignFirstResponder都查遍了,没有发现可疑的地方,可以断定,是UIWebView内部的操作导致键盘缩回了。

如图,断上所有有关resignFirstResponder的调用函数,这时就可以根据断点查出,到底那些代码,引起了网页键盘缩回。