测试开发-iOS真机Crash Log 的获取和分析

本文详细介绍了如何获取和分析iOS设备的Crash Log,包括使用Xcode从设备获取、直接从设备中提取、通过第三方SDK如Bugly获取。重点讲述了Crash文件的符号化过程,涉及dSYM文件的生成、校验和使用symbolicatecrash工具进行符号化。正确匹配.crash、.dSYM与.app的UUID是关键,以实现准确的错误定位。

本文主要介绍iPhone的crash log获取方式和log的符号化处理,通过符号化流程可封装成脚本,稳定测试中可直接对捕获的crash log进行解析

一:iOS Crash的收集

1. 使用Xcode从设备获取崩溃日志:

把手机连接到Mac,并选择Xcode->Windows->Device and Simulator,Devices选择你的手机,点击View Device Logs,打开的窗口就显示了当前连接设备的Log信息,type为Crash的就是崩溃的Log。

2. 通过设备直接获取崩溃日志:

1)打开设置->隐私->分析->分析数据,在其中找到你想要的应用程序的日志,日志将使用以下格式命名:<应用名称><崩溃时间><设备名>

2)选择所需的日志,复制文本或点击右上角的分享按钮分享出去,并且把分享得到的.ips.synced或者复制文本而来的.txt文件的后缀名改为.crash,因为Xcode不接受没有.crash扩展名的崩溃日志

3. 使用第三方SDK登入后台查看崩溃信息(Bugly等)

二:iOS Crash文件符号化

1.先来普及相关文件:

什么是dSYM符号集?

  • 符号集是我们每次Archive一个包之后,都会随之生成的.dSYM文件,这个文件必须使用Xcode进行打包才有(Debug模式默认是关闭的)。每次发布一个版本,我们都需要备份这个文件,以方便以后的调试。

  • 符号集中存储着文件名、函数名、行号与内存地址的映射表,通过符号集分析崩溃的.Crash文件可以准确知道具体的崩溃信息。

  • 我们如果不使用.dSYM文件获取到的崩溃信息都是不完全的(官方文档说了会导致不完全符号化,也就是一部分符号化好了,一部分没有)。

  • 每一个.dSYM文件都有一个UUID,和.app文件中的UUID对应,代表着是一个应用,而.dSYM文件中每一条崩溃信息也有一个单独的UUID,用来和程序的UUID进行校对。

符号集的生成与获取

  • 符号集在Organizer中选中打包的Archive->Show in Finder中选中 Archive ,右键显示包内容下的dSYMs文件夹下(或者点击Organizer右边的 Download dSYM ,XCode会从App Store下载该文件并插入到此Archive中)。
  • 如果在Debug模式下,找到项目的Build Settings
    Debug Infomatiion Format设置成DWARF with dSYM file
    并把Generate Debug Symbols置为YES
    然后编译,在项目文件夹Products中找到.app文件右击Show in Finder找到dSYM文件Xcode设置图

crash日志符号化

  • 通过dSYM中存储的信息可以把crash日志中的16进制数字一一对应成我们看得懂的文件名、函数名和行号,这个过程就叫做符号化

2.文件校验

在符号化Crash文件之前,你需要准备好.crash和.dSYM并校验是否匹配

准备好的文件为什么要校验?

  • 因为符号集存储着文件名、函数名、行号的信息,每一次代码更改后编译符号集也会随之变更,所以要想符号化.crash文件,.crash与符号集必须一一对应
  • 也就是说由版本为1.0的代码生成了1.0的APP,同时生成了1.0的符号集,1.0的APP发生了Bug,生成了104115的crash文件,也只有1.0的符号集才能够符号化104115的crash文件,而同时也必须找到1.0的代码才能根据符号化的crash文件精确定位到bug产生的地方。

如何判断.crash、.dSYM与.app(是否匹配你的代码)是否匹配?

  • 通过UUID来匹配,UUID是Xcode在编译时自动为每个版本生成的唯一标识,即使功能相同的可执行文件是使用相同的编译器设置从相同的源代码重建的,它也将具有不同的构建UUID,总之UUID是唯一的。
  • 每一个xx.app和xx.app.dSYM文件都有对应的UUID,crash文件也有自己的UUID,只要这三个文件的UUID一致,我们就可以通过他们解析出正确的错误函数信息了。

3.crash log符号化流程

1.新建一个crash文件夹
比如:Users/dongmax/Desktop/crash

2.获取.crash或.ips结尾的log,将需要分析的crash文件拷贝到Users/dongmax/Desktop/crash文件夹中
方法一:通过Xcode的Organizer查看某台iphone设备的DeviceLog,选择需要的crash log,导出XXX.crash文件。
方法二:ips可以通过命令行获取 比如:idevicecrashreport -u 758144d6984cce969c11435f10bd999f5b0f8e33 -e -k /Users/dongmax/Desktop/crash,获得XXX.ips;

3.找到对应的app文件
找到当前iphone设备上安装的ipa文件,更改文件后缀名为zip,解压后得到Payload文件夹,你需要的app文件就在其中了。

4.找到对应build版本的dSYM文件
注意:Xcode release 模式编译默认生成 dSYM 文件,debug 模式编译默认不生成;
Xcode 配置如下:
XCode -> Build Settings -> Code Generation -> Generate Debug Symbols -> Yes
XCode -> Build Settings -> Build Option -> Debug Information Format -> DWARF with dSYM File

查看 dSYM 文件:
Window -> Organizer -> Archives -> 选中需要导出dSYM的Archive右击 -> Show in Finder -> 右键.xcarchive文件显示包内容 -> dSYMs文件夹

!!!可以通过jenkins打包可以生成dsym文件,可以通过打包平台获取dsym文件

  1. 确定dSYM、app以及crash文件的关系
    每一个xx.app, xxx.app.dSYM文件都拥有相应的uuid,crash文件也有uuid,只有三者uuid一至才表明之三者可以解析出正确的日志文件。
  • 查看xx.app文件的uuid的方法,在terminal中输入命令:
    dwarfdump --uuid xxx.app/xxx (xxx工程名)
  • 查看xx.app.dSYM文件的uuid的方法,在terminal中输入命令:
    dwarfdump --uuid xxx.app.dSYM (xxx工程名)
    而.crash的uuid位于,crash日志中的Binary Images:中的第一行尖括号内。如:
    armv7 <8bdeaf1a0b233ac199728c2a0ebb4165>
  • 将对应的xxx.app.dSYM文件以及xxx.crash文件拷贝到同一文件夹中,如:Users/dongmax/Desktop/crash

6.拷贝symbolicatecrash到crash文件夹下面

1)find /Applications/Xcode.app -name symbolicatecrash -type f查找symbolicatecrash

2)其中/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash路径是需要的symbolicatecrash文件

3)将symbolicatecrash文件也拷贝到Users/dongmax/Desktop/crash文件夹中

7.通过symbolicatecrash分析crash文件

1)cd /Users/dongmax/Desktop/crash./symbolicatecrash

2)./symbolicatecrash ./xxx.crash ./AppName.app.dSYM > crash.log 该文件夹下面生成.log文件

注意1:如果终端报类似这样的错zsh: permission denied: ./symbolicatecrash 说明是symbolicatecrash文件有问题,可能该文件不是本机获取的,或者是之前获取的、Xcode升级等问题造成的,重新在本机上按上面方法获取即可

注意2:如果终端报类似这样的错Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.

尝试以下命令后,再重复上面命令,正常情况就可以分析bug了export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer

注意3:符号化之前,首先得确保Crash文件和dSYM这两个文件里面的UUID是一致的,如果不一致,就说明不是本次Crash对应的文件,就不能进行符号化;

注意4:Xcode在Debug模式下默认关闭生成dSYM文件,Release模式下默认生成dSYM文件的, 要生成dSYM文件需要查看一下项目的Build Settigns -> Build Options -> Debug information Format属性;只有该属性设置为DWARF with dSYM File时,编译才会生成dSYM文件

8.符号化成功后,十六进制就变成我们能看懂的内容 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值