iOS Crash调试和Crash符号化
SIGABRT
一个数组越界报的崩溃场景
数组越界.png
一点毛用都没有,它并不能精确的定位到crash发生在哪个源文件哪行代码中。为了精确的定位,我们可以使用Exception Breakpoint在Exception发生的时候暂停程序。
全局断点.png 准确定位.png
EXC_BAD_ACCESS的Crash
EXC_BAD_ACCESS 大部分是访问已被释放的内存导致,与SIGABRT不同,发生EXC_BAD_ACCESS错误时,在控制台里你不会得到一个错误的信息。
但是你可以通过一些设置得到这些错误信息并进一步定位内存错误发生的位置。快捷键Shift+command+< ,调出Edit scheme视图,勾选Enable zombie object,再次运行,便有一些有用的信息提示。
Edit scheme.png
屏幕快照 2016-07-21 下午3.38.01.png
message sent to deallocated instance 0x7fca5bca5690
,这句话大概意思就是使用了一个被释放的对象。注意:当你把选项Zombie Objects打开的时候,你的应用程序永远不会再释放(dealloc)内存,会导致不停的内存泄漏并最终在某一时刻run out of free memory,所以不要一直开着Zombie Objects选项,只有当你定位EXC_BAD_ACCESS错误的时候打开它,当bug解决掉之后,立刻关闭它。
获取Crash Log
很多测试人员在测试途中,或者开发者在自测的途中,会遇到APP crash的情况。一般的bug,一个合格的测试可以给出明确的重现步骤让开发者清晰地知道bug原因;也有不少bug,很多时候是偶现的,很可能无法再次重现出来,无法重现出来的bug是开发者头疼的,测试一般会给出bug的截图和重现步骤;而一般crash是比较严重的问题了,这个时候崩溃日志就尤为重要了,把崩溃日志send给开发人员,如此才能让开发者快速定位到错误的原因和位置。
那么测试如何拿到crash日志呢?
- 方法一:设备与电脑上的iTunes Store同步后,会将崩溃日志保存在电脑上。根据电脑操作系统的不同,崩溃日志将保存在以下位置:
Mac : ~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>
这个时候你会发现一大堆的.crash文件和.ips文件
屏幕快照 2016-07-21 下午4.29.15.png
- 方法二:通过Xcode获取到崩溃日志,方法是Xcode->Window->Devices
Crash Log的符号化
获取到了.crash或者.ips文件的时候(憋纠结这两个文件有什么差,改下后缀名就ok),用文本编辑器打开文件是一堆十六进制的内存地址,你会郁闷的发现压根看不懂。点击解读
我在解析崩溃信息的时候,首先在桌面上建立一个Crash文件夹,然后将.Crash、.dSYM、symbolicatecrash放在这个文件夹中,这样进入这个文件夹下。
-
crash log的获取
在上图上右键你要导出的Crash文件日志。 - dSYM 符号集的获取
我们每次Archive一个包之后,都会随之生成一个dSYM文件。每次发布一个版本,我们都需要备份这个文件,以方便以后的调试。进行崩溃信息符号化的时候,必须使用当前应用打包的电脑所生成的dSYM文件,其他电脑生成的文件可能会导致分析不准确的问题。
选中archive的版本右击,选择Show in Finder就可以选中archived 文件然后显示包内容,就可以找到dSYM文件了。
导出dSYM文件.png-
symbolicatecrash 工具的获取
symbolicatecrash,Xcode自带的崩溃分析工具,使用这个工具可以更精确的定位崩溃所在的位置,将0x开头的地址替换为响应的代码和具体行数。
symbolicatecrash我们可以在下面路径下可以找到,我用的是Xcode7。
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
这样三个文件都齐备好后,就开始进行解析的工作了。
三个文件.png
- ** 命令解析 **
开启命令行工具,进入崩溃文件夹crash中
cd /Users/自己MacPro上的名字/Desktop/崩溃文件夹crash
使用命令解析Crash文件,*号指的是具体的文件名
./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
如果上面命令不成功,使用命令检查一下环境变量
xcode-select -print-path
返回结果:
/Applications/Xcode.app/Contents/Developer/
如果不是上面的结果,需要使用下面命令设置一下导出的环境变量,然后重复上面解析的操作。(这一步很重要)
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
解析完成后会生成一个新的.Crash文件,这个文件中就是崩溃详细信息。图中红色标注的部分就是我们代码崩溃的部分。
符号化后的结果