为了方便,现在桌面上新建一个名为crash的文件夹,这样可以在解析的时候少些一堆路径。
整体流程如下:
需要准备三个文件:
1)、.app.dSYM(Debug Symbol
) 和 .app(可要可不要)
2)、.crash
3)、symbolicatecrash
把这三个文件放入同一个文件夹,命令行执行symbolicatecrash解析命令,就可以得到一个新的new.crash文件,查看这个文件就可以看到崩溃位置。
1、如何获得.app.dSYM和.app文件
自己电脑打的包:
选择Window --> Organizer --> Archives,选中自己刚打的包,右键,Show in Finder,会看到一个.xcarchive的文件。
选中.xcarchive,右键,显示包内容。
在名为dSYMs的文件夹,里面找到.app.dSYM文件,复制到桌面新建的文件夹下。
注: 如果项目中使用了很多第三方库,dSYMs文件夹中还会有很多第三方库的.dSYM文件(.framework.dSYM)。仔细找才能找到我们需要的.app.dSYM文件。
在名为Products文件夹中,点击进入Applications文件夹,找到.app(可能不带.app后缀)文件,复制到桌面新建的文件夹下。(其实这个文件在使用symbolicatecrash
解析crash的时候也派不上用场)
问题: 为什么打出来的包没有找到.app.dSYM
1)、在Build Settings中,搜索Debug Information Format
,查看值是否为DWARF with dSYM File
。
如果选为DWARF则不会产生dSYM文件,必须选择DWARF with dSYM File才会生成符号表文件。
2)、在Build Settings中,搜索Generate Debug Symbols
,看一下下面的值是否都为Yes,如果为No,则不会生成符号表文件,打出来的包也就找不到.app.dSYM文件。
总之,只有Debug Information Format
为DWARF with dSYM File
且 Generate Debug Symbols
为YES
,这两个条件同时满足时,才能生成.app.dYSM文件。
xcode打出去的包默认是release包,如果你把打出去的包改为了debug包,那么Debug Information Format
里的debug
项也要改为DWARF with dSYM File
。
2、如何获得.crash文件
手机插线连上Xcode,选择Window --> Devices and Simulators
选择对应的app,点击View Device Logs,如果很久没看过这个信息,打开后还要读取好久才能完全读完。
直接插线运行,出现的崩溃在这里是看不到的,只有杀掉app,从手机桌面点击icon启动之后的崩溃,才能在这里看见
找到最新的崩溃日志,右键,选择Export Log,导出.crash文件到桌面即可。
3、如何获得symbolicatecrash
可能不同版本Xcode或者mac系统不同,symbolicatecrash所在文件夹也不一样,不能用别人提供的路径去找,比如/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash,这是往上被人提供的路径,里面根本就没有symbolicatecrash。
一定要使用如下命令去找,这才是本机symbolicatecrash所在的有效路径。
在终端输入以下命令:
find /Applications/Xcode.app -name symbolicatecrash -type f
执行结果如下:
可以看到有多个路径,我们直接取最后一个就行,路径为:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
然后右键finder,选择前往文件夹...
,输入这个路径就可以。
也可以自己选中Xcode,右键显示包内容
,一层一层的顺着文件夹层级去找。
4、解析crash
在桌面上新建一个文件夹,把.app文件、.app.dSYM文件、.crash文件、symbolicatecrash工具,一起放到新建的文件夹下,如图:
1)、校验崩溃日志是否与dSYM文件匹配
获取dSYM文件对应的UUID:
$ dwarfdump —u 文件路径/xxx.app.dSYM
或者
$ dwarfdump --uuid xxx.app.dSYM
获取崩溃日志的UUID:
打开崩溃日志,全局搜索Binary Images,获取到如下:
可以看到两个UUID是相同的。
2)、执行symbolicatecrash
打开命令行,cd到新建的crash目录下,执行命令:
./symbolicatecrash JCrashDemo.crash JCrashDemo.app.dSYM > new.crash
报错: Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
需要设置一下导出的环境变量:
export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
设置完环境变量之后,再执行上面的symbolicatecrash
解析命令,就ok了,在crash目录下就会看到一个new.crash的解析好的文件了。如图:
可以看到ViewController.swift
这个文件的28行btnClicked(_:)
这个方法里产生了崩溃。
问题:
确定.dSYM和.crash文件的UUID相同后,执行解析命令,我们可以看到生成了new.crash文件,但是终端有个报错: No symbolic information found
。
错误原因1: .crash文件和.dSYM文件的uuid没对上。
错误原因2: 未知。(难道是原crash文件已经符号化过了,不需要再次符号好,所以报错?)
这时候查看原crash文件和新生成的crash文件,发现内容是一模一样的,而且两个文件里的内容都是符号化好了的。
注意:
只要手机上的应用是这台电脑安装打包的,这样的崩溃信息系统已经为我们符号化好了,如果还是没有符号化完毕 ,我们选择文件,然后右击选择Re-Symbolicate就可以(这种情况没有必要再去手动符号化了)。
如果是被人安装了你电脑打的包,崩溃后直接给你发了一个.crash文件,让你看一下问题。或者是别人电脑打的包,你安装了产生崩溃,再自己通过Xcode导出crash,这种情况下crash的crash是没有经过符号化的,所以就要你自己去符号化了。
补充
1)、同一个ipa包,不管产生多少个.crash文件,这些.crash文件的UUID都是同一个,即和这个.ipa对应的.app.dSYM文件的UUID相同。
2)、插线运行时产生的崩溃,系统是不会记录的,也就是说View Device Logs
里没有记录。只有从桌面重新点击icon启动后产生的崩溃才能看到。
插线运行的情况下,如果每次运行是代码都和上一次一模一样,那么点击桌面icon启动后产生的crash的UUID都是相同的。如果下次运行时的代码和上次有差别,哪怕只是多加了一行空格,那么两次产生的crash的UUID也不同。
3)、自己些demo测试时: 要想.crash文件和.app.dSYM文件的UUID相同,必须要导出.ipa包,再用手机安装这个包。也就是说产生crash的包和获取.app.dSYM的包必须是同一个。(所以不能插线运行之后产生.crash文件后,然后重新打个一模一样的包出来,再去找.app.dSYM文件,两者的UUID是无法匹配的。)
每次构建时都会生成新的唯一的能够标识那次构建的UUID,即便你用同样的源代码,通过同样的编译setting,UUID也不会相同。相应的,dSYM文件也不能用于解析其它(UUID对应的)binary信息,即便构建自于同一个源代码。
也就是说:你必须保存你最开始上传到App Store的发生crash的app的归档文件。dSYM文件和app二进制文件是一一对应,且每次构建都不相同。即便通过相同的源码和配置,再执行一次构建,生成的dSYM文件也无法和之前的crash report做符号化匹配。 如果你不在存有这个归档文件,你应该重新提交一次有归档的新版本,以确保再发生crash的时候你可以符号化crash report。
4)、在尚未点击Distribute App
导出.ipa包前或者导出.ipa包时没有勾选Rebuild from Bitcode
,dSYM文件夹下只有一个.app.dSYM文件。
如果在导出.ipa包时,勾选了Rebuild from Bitcode
,那么dSYM文件夹下就会多出很多个.dSYM文件,如图:
这些多出来的.dSYM文件的名称,就是这个.dSYM文件的uuid。它们和.app.dSYM这个主文件的uuid都不相同。
获取dSYM文件的几种方式。
方法一:
见上文 1、如何获得.app.dSYM和.app文件
方法二: (适用于已经上传到App Store的包)
在Archives organizer,选择你之前提交到App Store的Archive文件
选择Download dSYM按钮Archive
Xcode会下载dSYM文件并且把他们插入到选择的Archive中。这时候再按照方法一去取出来dSYM文件就行了。
方法三: (适用于已经上传到App Store的包)
自己进入app管理后台,点击TestFlight(以前是Activity),找到你想要的构建版本,点击进入,选择构建版本元数据,点击下载dSYM。
因为一般都会开启bitcode,所以下载的dSYM是一个zip包。
写在最后:
可参考文章: https://juejin.cn/post/6844903774780145678