解决闪退(崩溃)问题是移动应用开发者必备技能之一。 解决闪退可以分为线上和线下两种。线下(开发阶段)遇到闪退,可以直接DEBUG重现闪退。这个比较好解决。但是线上APP的闪退,我们则只能收集闪退日志来分析。所有有可能会使用第三方闪退日志收集平台(如友盟等)或者直接使用AppStore的app分析也比较直接方便的。但是往往线上解析的crashLog并没有达到我的预期,没有完全解析出来(只有一个地址)。这里介绍下自己手动再解析闪退日志的方式。解析闪退日志之前需要准备的东西1. .dSYM(debugging SYMbols)又称为调试符号表, .app(安装包), symbolicatecrash(解析闪退程序)在Organizer中的Archivs 选择提交到AppStore上的一个版本。右键选择 “Show in Finder” 可以找到 .xcarchive 文件, 从 .xcarchive文件中找到 我们需要的 .dSYM 和 .app 文件。使用命令查找 symbolicatecrash 文件
find /Applications/Xcode.app -name symbolicatecrash -type f
一般能在这个路径找到 "/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash"把 .dSYM, .app 和 symbolicatecrash 文件放到一个文件夹中2. 有了这些文件,有了崩溃日志文件,在解析之前一定要确保二者的对应关系,否则就算按照下述步骤解析出内容也肯定是不准确的。Apple会为每一个app版本在根据运行设备的CPU指令集(arm64和armv7)设置一个udid,所以二者的对应关系可以通过UUID来确定。在闪退日志中的udid格式是这样的: 闪退[/caption]执行以下命令获取符号表的udid
$dwarfdump --uuid YourAPP.app.dSYM
3. 使用 symbolicatecrash程序 解析闪退日志从Organizer->Crashes中获取 .xccrashpoint 文件,打开显示内容,可以获取 .crash 文件(crashone.xccrashpoint/DistributionInfos/all/Logs/.crash)。复制.crash文件到和symbolicatecrash程序同级的目录中 改名为 YourAPP.crash, 使用以下命令解析闪退日志
<span style="color:#FFFFFF;"><span style="background-color: rgb(0, 0, 0);">export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
./symbolicatecrash YourAPP.crash YourAPP.app > YourAPP.log</span></span>
解析出来的 YourAPP.log可以清晰的得出在程序的那个类中闪退了。4. 在第三方闪退日志收集中往往只有一些地址。这里有以下几种通过闪退地址,来解析闪退日志a ) 用到的命令 - dwarfdump具体命令如下:
$dwarfdump --lookup 0x10003632c YourAPP.app.dSYM [--arch armv7]
需要注意的是:这里的armv7是运行设备的CPU指令集(一般有armv7 和 arm64 两种),而不是二进制文件的指令集arch 为可选,没有则会同时给出两种指令集上的结果。运行结果如下:
dwarfdump解析结果[/caption]就可以明显的看出哪个类出现了闪退b ) 用到的命令 - atos, 复制 YourAPP.app.dSYM/Contents/Resources/DWARF/YourAPP 文件到当前目录具体命令如下:
$atos -o YourAPP 0x10003632c
或者
$atos -o YourAPP.app.dSYM/Contents/Resources/DWARF/YourAPP 0x10003632c
运行结果如下:
结果更加简洁明了,直接只显示闪退的位置 [-arch armv7] [-arch arm64]为可选参数