一.设置和查看断点ios
断点能够分为如下3种类型。express
1. 文件行断点设置数组
添加断点->右键选择Edit Breakpointapp
Condition:指的是条件表达式,该项容许咱们对断点生效设置条件,表示当知足某一特定条件的前提下,该断点才生效。(该条件的录入,不可以识别预处理的宏定义,也不能识别断点做用域以外的变量和方法)。eg:i == 1 ; (i == 1 || i == 2)框架
Ignore:忽略次数。它指定了在断点生效,应用暂停以前,代码忽略断点的次数。你若是但愿应用运行一段时间后断点才生效,那么就可使用这个选项。好比说在调试某一循环体的时候。eg:Ignore 2 == 前两次执行此处的代码不会触发该断点,从第三次开始触发该断点。若是数字为n,则从第n次开始触发该断点。iphone
Action:动做。它表示当断点生效时,Xcode做出反应后的行为动做。点击右边的Add Action选项会弹出如图异步
图中所示红色方框中的选项,可让你指定那一种动做。默认的是Debugger Command。还有如下几种动做供选择,下面逐一介绍。函数
(1).AppleScript工具
它是苹果提供的一种脚本语言,用来执行一些预先指定的行为。选中该选项,将会出现如图所示的AppleScript语言的输入框。测试
你们可能看到了,我在输入框中输入了本门至高无上的心法秘诀,它的意思是弹出一个显示“Hello World!”的对话框。点击Compile按钮后,若是没有错误,会显示成功信息。而点击Test按钮,会测试运行效果,以下图
至于红色方框中的内容是三种特殊符号相对应的定义。
符号标记 定义 @expression@ LLDB表达式 %B 断点的名称 %H 遇到该断点的次数
(2).Capture GPU Frame
这个功能用于当断点生效时,捕获GPU当前所绘制的帧。该功能是辅助图形调试的。
(3).Debugger Command
默认的选项,可让断点执行LLDB调试命令。
po _imageArray 打印该断点上面用到的数组内容
(4).Log Message
使用Log命令能够生成消息队列,将相关的消息输出到控制台上,还有一个Speak Message选项,能够播报消息。
(5).Shell Command
该动做接收一个命令文件和参数列表。以下图所示
命令文件必须是一个可执行的二进制程序或者脚本。能够复制粘贴输入路径,也能够点击Choose按钮选择具体文件。
参数经过空格表示分割,也能够在两个@字符之间包含LLDB表达式。
通常状况下,Xcode会异步执行Shell Command,也就是说,Shell Command 和调试器将会同步执行。若是但愿调试器在Shell Command命令完成后运行,则能够勾选下面的Wait until done选项。
(6).Sound
动做会在断点被触发时,弹出声音提示。
Options: 在执行完事件以后自动继续执行。选中该选项以后,程序不会止步于该断点,遇到该断点也会继续执行,可是会响应action中的调试信息。
2. 符号断点设置
设置符号断点与设置文件行断点不一样,须要点击导航面板中的按钮打开断点导航面板,如图15-10所示。
在断点导航面板中,能够看到全部的断点。
其中有两项——Add Symbolic Breakpoint和Add Exception Breakpoint,前者能够建立符号断点,后者能够建立异常断点。这里咱们选择Add Symbolic Breakpoint菜单项,此时能够弹出建立符号断点对话框,如图
Symbol:后面能够是
1. 方法名称:会对全部具备此方法名称的类方法生效。例如 initWithFrame: 。
2. 特定类的方法:OC类和C++类都适用,例如 ,[UIView initWithFrame:]或者 Shap::draw()。
3. 函数名称。例如普通C函数。
Module:是模组的意思,用来限制知足符号的方法,编译器将只会在断点知足这个模组的符号的时候才回暂停
其他的选项同上。
3. 异常断点设置
Exception选项可让你选择响应Objective-C对象抛出的异常,也能够选择响应C++对象抛出的异常。
Break则是选择断点所接收的异常,是接收“Throw”语句抛出的异常仍是Catch语句的。
3.OpenGL ES错误断点(OpenGl ES Error Breakpoint)
这个断点的做用和异常断点相似,只不过这个断点只有在openGL ES错误发生的时候才会触发。
4.测试失败断点 Test Failure Breakpoint
仅在测试断点失败的时候才会执行,这个时候,应用将会暂停在引起测试失败的代码处,而不是中止在测试代码处。
2、调试工具栏
模拟位置按钮左边的为图层查看按钮,点击能够查看界面的各个图层
变量查看窗口
Auto。查看常用的变量。
Local Variables。查看本地变量。
Variables, Registers, Globals and Statics。查看所有变量,包括寄存器和全局变量等,如图15-25所示,
其中图标A是自动变量、S是静态变量、R是寄存器、L是本地变量。
Print Description of “i” 打印变量信息
Edit Value… 编辑变量的值
3、日志与断言输出
1. 使用NSLog函数
2. 使用NSAssert宏
NSLog函数是无条件输出,即程序运行到该语句,就会输出结果。若是想有条件输出结果,可使用NSAssert
宏。注意,NSAssert并非函数,它的定义以下:
#define NSAssert(condition, desc, ...)
其中第一个参数condition是布尔表达式,第二个参数desc是描述信息,参数后面的...是格式化desc描述信息
的。若是condition为NO,则输出desc描述信息,并抛出异常NSInternalInconsistencyException;若是
condition为YES,则不输出信息。
2. 移除项目中的打印信息
(1)移除NSAssert
NS_BLOCK_ASSERTIONS是Foundation框架中定义好的预处理宏,若是在编译环境中设置NS_BLOCK_ASSERTIONS,在编译的时候NSAssert宏将被移
(2) 移除NSLog
扩展:
1.本身在pch文件中预约义以下宏
#ifdef MY_MACRO
#define NAME @"测试版本"
#else
#define NAME @"上线版本"
#endif
2.
设置preprocessor Macros—>Debug(添加MY_MACRO=1)
3.在项目中使用NAME宏
若是项目Scheme编译模式为Debug 输出:name = 测试版本
若是项目Scheme编译模式为release 输出:name = 上线版本
4、LLDB调试工具
p和po就是调试工具的命令,调试工具的编译器相对独立于Xcode。咱们进行Objective-C程序开发时,用过3种编译器——GCC、LLVM GCC和Apple LLVM,其中GCC是比较古老的编译器,如今咱们主要使用LLVM GCC和Apple LLVM。GCC的调试工具是GDB,是GCC Debug工具的缩写,LLVM GCC和Apple LLVM的调试工具是LLDB(或lldb)。进入LLDB调试工具的一种方式是从终端进入,另一种是从Xcode进入。Xcode工具咱们比较熟悉,这里主要介绍这种方式。具体作法很简单,就是在程序中设置断点,当程序挂起时,在输出窗口中选择Debugger Output,这时输出窗口有(lldb)
命令提示符,这就进入了LLDB调试工具了。
经常使用命令:po
5、异常堆栈报告分析
[exception reason] 异常产生的缘由
[exception callStackSymbols] 符号化打印
查看设备的崩溃日志
Window—>Devices—>View Device Logs
点击Re-Symbolicate Log 符号化日志信息
红色标注部分指出崩溃代码在ViewController0.m的第60行代码
6、符号化设备的崩溃日志
1.手动符号化设备的崩溃日志
咱们在ios开发中会碰到的不少crash问题,若是Debug调试模式的话,咱们能够每每很容易的根据log的输出定位到致使crash的缘由,但对于已经上线的应用,或者是release环境包致使的crash,咱们就须要一些特殊的手段来经过crash log进行分析定位了。
经过参考网上的一些资料,总结了一下,下面介绍一下经过dSYM文件以及crash log分析定位的方法。
1.导出crash log
经过Xcode的Organizer查看某台iphone设备的DeviceLog,选择须要的crash log,导出XXX.crash文件。
2.找到对应的app文件
找到当前iphone设备上安装的ipa文件,更改文件后缀名为zip,解压后获得Payload文件夹,你须要的app文件就在其中了。
3.找到对应build版本的dSYM文件
dSYM文件是iOS编译后保存16进制函数地址映射信息的文件,每次应用程序build后,都会生成对应的xxx.app, xxx.app.dSYM文件。
4.肯定dSYM、app以及crash文件的关系
首先将dSYM、app以及crash放入同一个文件夹中,经过终端进入该文件夹。
每个xx.app, xxx.app.dSYM文件都拥有相应的uuid,crash文件也有uuid,只有三者uuid一至才代表之三者能够解析出正确的日志文件。
查看xx.app文件的uuid的方法,在terminal中输入命令:
dwarfdump --uuid xxx.app/xxx (xxx工程名)
查看xx.app.dSYM文件的uuid的方法,在terminal中输入命令:
dwarfdump --uuid xxx.app.dSYM (xxx工程名)
而.crash的uuid位于,crash日志中的Binary Images:中的第一行尖括号内。如:
armv7 <8bdeaf1a0b233ac199728c2a0ebb4165>
5.经过symbolicatecrash分析crash文件
Xcode有自带的symbolicatecrash工具,能够经过dSYM文件将crash文件中的16进制地址转换成可读的函数地址。该文件是隐藏文件,能够经过以下命令查找并拷贝到系统目录下,并创建快捷方式。
1)打开终端,进入到symbolicatecrash工具所在的文件夹目录
第一步:找到symbolicatecrash工具所在的文件夹目录
find /Applications/Xcode.app -name symbolicatecrash(速度快)
或者
find /Applications/Xcode.app -name symbolicatecrash -type f
运行结果
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
第二步:进入该目录
cd /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
2)查找确认是否存在symbolicatecrash(可省略)
ls -al | grep symbolicatecrash
bogon:Resources bang$ ls -al | grep symbolicatecrash
-rwxr-xr-x 1 root wheel 37893 2 26 10:22 symbolicatecrash
3)将symbolicatecrash工具拷贝到dSYM、app以及crash所在的文件夹
bogon:Crash bang$ cp symbolicatecrash /Users/bang/Desktop/Crash
4)执行以下命令,便可正确解析crash文件
./symbolicatecrash xxx.crash xxx.app.dSYM > test.txt
./symbolicatecrash DemoModel.crash CA3ACCD1-F63D-3A37-9773-82B155C02DA6.dSYM >crash2.txt
5)打开crash2.txt就能够看到符号化的崩溃日志了
2.经过友盟符号化设备的崩溃日志
若是出现bug的构建版本是在本身的电脑上打包的,那么直接打开终端输入黑色部分的代码就能定位到崩溃的代码位置;
若是出现bug的构建版本不是在本身电脑上打包的,那么须要找到对应的构建版本拷贝到本身项目中构建版本的目录中