@blueGhost
2017-09-26T17:45:02.000000Z
字数 1158
阅读 1328
iOS
参考文献:
发布出去的包,怎么分析生产环境的crash?首先你得有下面的物料:
- 发布出去的ipa包,即你上传给苹果爸爸审核的包
- 打这个发布ipa包时,对应产出的dsym文件
- crash文件/日志
- 然后你得有atos工具,这个和xcode一起带的,是一个命令行工具,用于将crash的地址转换为代码位置
dsym实际上是打包ipa时,将代码的信息和ipa二进制文件对应起来,然后记录下来,可以粗浅的讲:记录了二进制可执行文件ipa和源代码的映射。所以是一一对应的,就像RSA的公、私密钥一一对应一样,必须对的上才能解析正确。
另一方面,也必须确认,crash日志是否就是该ipa包产生的?只有三者都对应上了,拿来分析crash才有用。
可以通过dwarfdump命令来取出ipa、dsym的uuid,两者必须一致。然后查看这个uuid是否和crash日志中记录的UUID一致。
dwarfdump --uuid [file]
假设有:Test.ipa,Test.app.dSYM,Test.crash,这几个文件放在当前目录下,然后shell命令运行在当前目录下。
dwarfdump --uuid Test.app.dSYM/Contents/Resources/DWARF/Test
由于ipa是进行了格式打包的,所以需要先解压出来:
//转为zip文件格式:
cp Test.ipa Test.zip
//解压后得到:Payload/Test.app
unzip Test.zip
//取得uuid
dwarfdump --uuid Payload/Test.app/Test
可以在crash日志的Binary Images:下的一行看到uuid,这里还可以看到crash发生在armv7架构的机器下。
如果上面几步得出的uuid对的上,则可以进入下一步。(当然,如果你的ipa支持多个硬件架构,比如armv7,arm64,每个架构对应一个uuid,你需要拿对应的架构的uuid来比较)
就是将地址符号转化为crash的代码行数等信息,假设发生奔溃的地址是“0xae808”。
xcrun atos -arch armv7 -o Test.app.dSYM/Contents/Resources/DWARF/Test -l 0xa8000 0xae808
//输出:
-[ViewController viewDidLoad]ViewController.m:61
-l指出偏移量,这个偏移量可以在crash日志上查到,在Binary Images下面一行的第一个十六进制数即是偏移量0xa8000