[关闭]
@blueGhost 2017-09-26T17:45:02.000000Z 字数 1158 阅读 1347

crash分析

iOS


参考文献:


发布出去的包,怎么分析生产环境的crash?首先你得有下面的物料:

  1. 发布出去的ipa包,即你上传给苹果爸爸审核的包
  2. 打这个发布ipa包时,对应产出的dsym文件
  3. crash文件/日志
  4. 然后你得有atos工具,这个和xcode一起带的,是一个命令行工具,用于将crash的地址转换为代码位置

一. 校验crash日志&ipa包&dsym是否对应上?

dsym实际上是打包ipa时,将代码的信息和ipa二进制文件对应起来,然后记录下来,可以粗浅的讲:记录了二进制可执行文件ipa和源代码的映射。所以是一一对应的,就像RSA的公、私密钥一一对应一样,必须对的上才能解析正确。
另一方面,也必须确认,crash日志是否就是该ipa包产生的?只有三者都对应上了,拿来分析crash才有用。

可以通过dwarfdump命令来取出ipa、dsym的uuid,两者必须一致。然后查看这个uuid是否和crash日志中记录的UUID一致。

  1. dwarfdump --uuid [file]

假设有:Test.ipa,Test.app.dSYM,Test.crash,这几个文件放在当前目录下,然后shell命令运行在当前目录下。

1.1获取dsym文件的uuid

  1. dwarfdump --uuid Test.app.dSYM/Contents/Resources/DWARF/Test

1.2获取ipa文件的uuid

由于ipa是进行了格式打包的,所以需要先解压出来:

  1. //转为zip文件格式:
  2. cp Test.ipa Test.zip
  3. //解压后得到:Payload/Test.app
  4. unzip Test.zip
  5. //取得uuid
  6. dwarfdump --uuid Payload/Test.app/Test

1.3查看crash日志中记录的uuid

可以在crash日志的Binary Images:下的一行看到uuid,这里还可以看到crash发生在armv7架构的机器下。

262c9d3630b0adfd50ca65c078f01faf.png-104.6kB

如果上面几步得出的uuid对的上,则可以进入下一步。(当然,如果你的ipa支持多个硬件架构,比如armv7,arm64,每个架构对应一个uuid,你需要拿对应的架构的uuid来比较)

二. 将crash地址符号化

就是将地址符号转化为crash的代码行数等信息,假设发生奔溃的地址是“0xae808”。

  1. xcrun atos -arch armv7 -o Test.app.dSYM/Contents/Resources/DWARF/Test -l 0xa8000 0xae808
  2. //输出:
  3. -[ViewController viewDidLoad]ViewController.m:61

-l指出偏移量,这个偏移量可以在crash日志上查到,在Binary Images下面一行的第一个十六进制数即是偏移量0xa8000
faaeafc589c4d2eafc0dd20a1dfbf8c9.png-113.6kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注