iOS常用Debug方式

2,349 阅读3分钟

1.普通断点

插入方式:command+\ 或者 单击编辑区域左侧

2.条件断点

只有满足条件的情况下断点才会断下来,条件断点对于一个函数重复多次但是只需要调试其中某一次的情况很适用。

插入方式:右键普通断点 -> Edit Breakpoint

3.符号断点

符号断点其实就是对一个特定的函数名下断点,这里得方法可以是OC的方法也可以是一个C++的函数名。 在导航区选择断点tab页 -> 点击最下面的加号 -> Add Symbolic Breakpoint

调用test方法时会命中断点,-表示实例方法,+表示类方法

符号断点在调试一些没有源码的模块时比较有用,比如调试一个第三方提供的Lib库,或者系统的模块,可以在相应函数处下断点,可以大概调试清楚程序的运行流程。同时可以在断点的时候查看到参数信息。

4.异常断点

添加方式:导航区 -> 断点tab –> 左下角加号 -> Add Exception Breakpoint

一般情况下很多crash都是因为异常导致的,打开异常断点可以在抛出异常的时候断下,然后查看堆栈即可确认是那一行代码引起的异常。 如果日志窗口没有输出异常信息,可以切到抛异常的那一帧,然后po r0或者poeax即可看到异常信息。

5.watch断点

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

需要注意的一点是watch断点是有个数限制的,在intel CPU上最大是4个,在ARM CPU上最大是2个。

6.断点后action

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

7.Debug常用命令

p,po命令: 使用p命令查看基本数据类型的值,使用po命令查看oc对象

frame命令: 查看变量的具体值

(lldb) frame variable i (NSInteger) i = 1

如果什么参数也不加,将会把所有的参数和本地变量到打印出来

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

call命令:

image命令: image命令可以列出当前App中的所有模块,可以查找一个地址对应的代码位置。 在调试越狱插件时,可以方面的用image list命令查看越狱插件是否注入自己的App。 当遇到crash时,查看线程栈只能看到栈帧的地址,使用“image lookup –address 地址”命令可以方便的定位到这个地址对应的代码行。

bt命令: bt命令可以查看线程的堆栈信息,该信息也可以在导航区的Debug Navigator看到。

  1. UI调试 po [view recursiveDescription],该命令可以打印出view的所有子view的结构关系

9.查看野指针导致的crash:zombies(使用僵尸模式)