这篇文章,我不说最基本的怎么看crash的栈,怎么定位crash的thread,希望看这篇文章的童鞋都有这个基础。这篇文章我主要想记录一下,上传到Fabric或Bugly或者从手机里拷贝出来的crash log,只有地址,没有项目函数该怎么看。如下图:
看到这样的crash log,是不是一脸懵逼,只能猜出大概就是FMDB里出问题了,但是具体哪里出问题,出了啥问题,都不知道,没定位。
之所以出现这样的问题是因为没有符号化,符号化就是将系统的内存地址与项目的函数名、文件名、行号进行映射,快速并准确地定位用户APP发生Crash的代码位置,简单的说就是对APP发生Crash的程序堆栈进行解析和还原。一般在哪台机器打包的,就去哪台机器看crash log,Xcode会自动帮你解析,如果想了解更多,请参考文章 分析iOS Crash文件:符号化iOS Crash文件的3种方法。
符号化需要三个文件:
- crash报告(.crash文件)
- 符号文件 (.dsymb文件)
- 应用程序文件 (appName.app文件,把IPA文件后缀改为zip,然后解压,Payload目录下的appName.app文件), 这里的appName是你的应用程序的名称。
项目集成第三方上传crash log(如Fabric /Bugly/友盟),一般都会要求你上传对应的符号化文件,它会自动帮你符号化crash log。
定位.dsymb文件
- 方式一
通过打包方式获取,
Xcode -> Window -> Organizer -> Show xcarchive file in Finder -> Right Click Your xcarchive file -> Select "Show Package Contents"
附上详细动画教程
如果进去还是没有.dsymb文件,请进入Project Build Settings -> Generate Debug Symbols 确保它的值是Yes
-
方式二
如果不想通过打包方式拿到.dsymb文件,则直接定位Build后的.app文件,在该目录下面可以找到.dsymb文件,
如果没有,请进入Project Build Settings > Build Options > Debug Information Format 确保它的值是DWARF with dSYM file,这样你在Products目录下,定位.app文件的目录下就有.dsymb文件了。
得到.dsymb文件就可以进行符号化了,不管是instrument还是第三方的,都可以使用。
但是有点特别需要说明,如果你的IPA包是支持bitcode的,那即便你上传了符号化文件,也是解析不了的,只会显示__hidden(排除上架了App Store,从iTunes下载.dsymb),如何解决?
用dsymutil命令:
在.dSYMs文件夹同目录下找到BCSymbolMaps文件夹(file.xcarchive/BCSymbolMaps)再用下面命令,就可以啦。
dsymutil --symbol-map PATH_TO_BCSYMBOLMAPS_DIR downloaded.dSYM
有多个的话,循环:
for d in dSYMs/*
dsymutil --symbol-map path/to/file.xcarchive/BCSymbolMaps $d
end
参考文章:
分析iOS Crash文件:符号化iOS Crash文件的3种方法
crash log调用栈看不到的解决方案(debug symbols不起作用)
Bugly iOS 符号表配置
Xcode - There are no dSYMs available for download
Swift bitcode Crashlytics __hidden