使用symbolicatecrash解析崩溃日志

为了方便,现在桌面上新建一个名为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才会生成符号表文件。

image.png

2)、在Build Settings中,搜索Generate Debug Symbols,看一下下面的值是否都为Yes,如果为No,则不会生成符号表文件,打出来的包也就找不到.app.dSYM文件。

image.png

总之,只有Debug Information FormatDWARF with dSYM FileGenerate Debug SymbolsYES,这两个条件同时满足时,才能生成.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启动之后的崩溃,才能在这里看见

image.png

找到最新的崩溃日志,右键,选择Export Log,导出.crash文件到桌面即可。
image.png

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

执行结果如下:


image.png

可以看到有多个路径,我们直接取最后一个就行,路径为:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
然后右键finder,选择前往文件夹...,输入这个路径就可以。
也可以自己选中Xcode,右键显示包内容,一层一层的顺着文件夹层级去找。

4、解析crash

在桌面上新建一个文件夹,把.app文件、.app.dSYM文件、.crash文件、symbolicatecrash工具,一起放到新建的文件夹下,如图:


image.png

1)、校验崩溃日志是否与dSYM文件匹配

获取dSYM文件对应的UUID:

$ dwarfdump —u 文件路径/xxx.app.dSYM
或者
$ dwarfdump --uuid xxx.app.dSYM
image.png

获取崩溃日志的UUID:
打开崩溃日志,全局搜索Binary Images,获取到如下:


image.png

可以看到两个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(_:)这个方法里产生了崩溃。

image.png

问题:

确定.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文件,如图:

image.png

这些多出来的.dSYM文件的名称,就是这个.dSYM文件的uuid。它们和.app.dSYM这个主文件的uuid都不相同。

获取dSYM文件的几种方式。

方法一:
见上文 1、如何获得.app.dSYM和.app文件

方法二: (适用于已经上传到App Store的包)
在Archives organizer,选择你之前提交到App Store的Archive文件
选择Download dSYM按钮Archive

image.png

Xcode会下载dSYM文件并且把他们插入到选择的Archive中。这时候再按照方法一去取出来dSYM文件就行了。

方法三: (适用于已经上传到App Store的包)
自己进入app管理后台,点击TestFlight(以前是Activity),找到你想要的构建版本,点击进入,选择构建版本元数据,点击下载dSYM。
因为一般都会开启bitcode,所以下载的dSYM是一个zip包。

image.png

写在最后:
可参考文章: https://juejin.cn/post/6844903774780145678

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容