iOS开发中,对于线上版本或公测版本产生的crash,我们可以通过结合.app ,.dSYM 及 crash log 三个文件来进行解析定位。
最新更新:
最近对查找线上Crash做了整理,写成CrashScript.sh,详情见下面查找Crash脚本
获取iOS设备上的 crash log
将iOS设备连接到电脑上,打开 Xcode -> Organizer -> Devices,找到该台设备,在 Device logs 中找到 crash log(后缀为 .crash 的 log 文件),将其导出即可。
如果你的应用已经上架App Store,那么开发者可以通过iTunes Connect(Manage Your Applications - View Details - Crash Reports)获取用户的crash log。不过这并不是100%有效的,而且大多数开发者并不依赖于此,因为这需要用户设备同意上传相关信息,详情可参见iOS: Providing Apple with diagnostics and usage information摘要。
第三方crash收集系统,甚至还带了符号化crash日志的功能。比较常用的有Crashlytics,Flurry等。
确保.app .dSYM和crash log的uuid相同
以上三者的uuid必须都一样才能进行解析,查看三个文件的 uuid :
查看xx.app文件的uuid的方法,在终端输入:
$ dwarfdump –uuid xxx.app/xxx (xxx工程名)
查看xx.app.dSYM文件的uuid的方法,在命令行输入:
$ dwarfdump –uuid xxx.app.dSYM (xxx工程名)
查看 crash log 文件的 uuid的方法:
在 crash log 文件中,找到 Binary Images: 项目名后面第一个尖括号中的一串码就是改 crash log 文件的 uuid。
如下,70464c7fc4df37f38f81eeaf88a0713d就是uuid。1
2Binary Images:
0x10000c000 - 0x100cf7fff xxx (xxx工程名) arm64 <70464c7fc4df37f38f81eeaf88a0713d>
显示.dYSM包内容
进入/Contents/Resources/DWARF路径下,执行命令:
atos -arch armv7 -o XXX(项目名称) 0x17D580(16进制crash奔溃地址)
显示结果
1 |
|
可以看到是 PCBabyMyGroupReplyTVCell 类第66行出错。
如果定位不对,可能涉及到地址偏移的计算。首先查看起始地址,即使每次iOS app启动都会加载(main module)主模块在不同的内存地址,但是dSYM文件总是假设你的main module加载在地址 0x100000000(64位) ,或者 0x4000(32位) 。
查看偏移,显示.dYSM包内容,进入/Contents/Resources/DWARF路径下,执行命令:
1 |
|
显示结果
1 |
|
看到vmaddr显示为0x0000000100000000,所以偏移地址计算为:0x17D580+0x0000000100000000=0x10017D580。
再次执行终端命令:
atos -arch armv7 -o XXX(项目名称) 0x10017D580
附:32位及64位设备的执行命令
32位: xcrun atos -arch armv7 -o xxx(应用名称) xxx(偏移地址)
64位: xcrun atos -arch arm64 -o xxx(应用名称) xxx(偏移地址)
查找Crash脚本
注意!!!Shell脚本默认无法处理带空格的文件路径,请确保.xcarchive
文件以及CrashScript.sh
脚本所在路径名不存在空格。(Xcode Archive生成的.xcarchive
文件名默认带空格,请去除)
获取打包生成的 .xcarchive
文件,将其和CrashScript.sh
脚本放到同一级目录下,运行脚本:
1 |
|
参数说明:[]表示可选参数,<>表示必填参数
1 |
|
脚本完整代码
1 |
|