iOS基础知识总结(持续更新...)iOS开发技术iOS开发

iOS Crash调试和Crash符号化

2016-07-21  本文已影响2173人  朝雨晚风

SIGABRT

一个数组越界报的崩溃场景


数组越界.png

一点毛用都没有,它并不能精确的定位到crash发生在哪个源文件哪行代码中。为了精确的定位,我们可以使用Exception Breakpoint在Exception发生的时候暂停程序。


全局断点.png 准确定位.png

EXC_BAD_ACCESS的Crash

EXC_BAD_ACCESS 大部分是访问已被释放的内存导致,与SIGABRT不同,发生EXC_BAD_ACCESS错误时,在控制台里你不会得到一个错误的信息。

EXC_BAD_ACCESS.png
但是你可以通过一些设置得到这些错误信息并进一步定位内存错误发生的位置。快捷键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日志呢?

Mac : ~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>

这个时候你会发现一大堆的.crash文件和.ips文件


屏幕快照 2016-07-21 下午4.29.15.png 1168978-2402f1965a1e11e5.png.jpeg

Crash Log的符号化

获取到了.crash或者.ips文件的时候(憋纠结这两个文件有什么差,改下后缀名就ok),用文本编辑器打开文件是一堆十六进制的内存地址,你会郁闷的发现压根看不懂。点击解读

屏幕快照 2016-07-21 下午4.19.58.png

我在解析崩溃信息的时候,首先在桌面上建立一个Crash文件夹,然后将.Crash、.dSYM、symbolicatecrash放在这个文件夹中,这样进入这个文件夹下。

我们每次Archive一个包之后,都会随之生成一个dSYM文件。每次发布一个版本,我们都需要备份这个文件,以方便以后的调试。进行崩溃信息符号化的时候,必须使用当前应用打包的电脑所生成的dSYM文件,其他电脑生成的文件可能会导致分析不准确的问题。

选中archive的版本右击,选择Show in Finder就可以选中archived 文件然后显示包内容,就可以找到dSYM文件了。

导出dSYM文件.png
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

这样三个文件都齐备好后,就开始进行解析的工作了。


三个文件.png
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文件,这个文件中就是崩溃详细信息。图中红色标注的部分就是我们代码崩溃的部分。


符号化后的结果

参考文章

命令行工具解析Crash文件,dSYM文件进行符号化
iOS调试之 crash log分析
iOS应用崩溃日志分析

上一篇下一篇

猜你喜欢

热点阅读