相关 Apple 官方文档

iOS Crash文件的解析需要三个文件:

  • bilibili.crash/bilibili.ips - 从崩溃的手机、itunes connect或者第三方日志系统获得
  • bilibili.dSYM - 从 xcarchive 文件里获得
  • symbolicatecrash 在 xcode 里,不同版本所在位置也不一样

解析步骤

1.新建一个文件夹,将上面四个文件放进去,使用以下命令查找 symbolicatecrash 文件的位置:

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

2.使用以下命令确定和 bilibili.dSYM 文件里的 UUID 一致

1
dwarfdump --uuid bilibili.dSYM

3.使用该命令解析:

1
./symbolicatecrash bilibili.crash bilibili.dSYM > crash.log

如果遇到无法找到DEVELOPER_DIR的错误:

1
export DEVELOPER_DIR='/Applications/Xcode.app/Contents/Developer'

打开新生成的 crash.log 文件,搜索关键词 Exception 查看崩溃信息,从 Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d 中的 code 可以确定大致原因。

Exception Type

  • EXC_BAD_ACCESS

此类型的Excpetion是我们最长碰到的Crash,通常用于访问了不改访问的内存导致。一般EXC_BAD_ACCESS后面的”()”还会带有补充信息。

* SIGSEGV: 通常由于重复释放对象导致,这种类型在切换了ARC以后应该已经很少见到了。
* SIGABRT:  收到Abort信号退出,通常Foundation库中的容器为了保护状态正常会做一些检测,例如插入nil到数组中等会遇到此类错误。
* SEGV:(Segmentation  Violation),代表无效内存地址,比如空指针,未初始化指针,栈溢出等;
* SIGBUS:总线错误,与 SIGSEGV 不同的是,SIGSEGV 访问的是无效地址,而 SIGBUS 访问的是有效地址,但总线访问异常(如地址对齐问题)
* SIGILL:尝试执行非法的指令,可能不被识别或者没有权限
  • EXC_BAD_INSTRUCTION

此类异常通常由于线程执行非法指令导致

  • EXC_ARITHMETIC

除零错误会抛出此类异常

Exception Code

  • 0xbaaaaaad 此种类型的log意味着该Crash log并非一个真正的Crash,它仅仅只是包含了整个系统某一时刻的运行状态。通常可以通过同时按Home键和音量键,可能由于用户不小心触发
  • 0xbad22222当VOIP程序在后台太过频繁的激活时,系统可能会终止此类程序
  • 0x8badf00d 程序启动或者恢复时间过长被watch dog终止
  • 0xc00010ff 程序执行大量耗费CPU和GPU的运算,导致设备过热,触发系统过热保护被系统终止
  • 0xdead10cc 程序退到后台时还占用系统资源,如通讯录被系统终止
  • 0xdeadfa11 程序无响应用户强制关闭

脚本自动解析

2019 年更新…

如果每次都手动输入命令,也太繁琐了些,写个脚本自动解析,还能支持批量解。后缀改成 command 还能双击打开。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash

set -e
function export_()
{
cd $1
export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
if [[ ! -d outlog ]]; then
mkdir outlog
else
echo "outlog exist"
fi
}

function analyze()
{
for crash_file in $(find . -name "*.ips" -o -name "*.crash"); do
new_file=$(basename $crash_file)
$1 $crash_file $2 > outlog/$new_file+".txt"
done
echo "done"
}

if [[ $# > 0 ]]; then
echo
else
set $(pwd)
fi

export_ $1
analyze $(find /Applications/Xcode.app -name symbolicatecrash -type f | tail -1) ./bili-universal_arm64