iOS/OSX Crash:崩溃日志报告
iOS/OSX Crash:异常类型
iOS/OSX Crash:捕捉异常
iOS Crash:函数调用栈
OSX Crash:为什么抛出异常时应用不崩溃
1 如何获取Crash日志[1]
Crash日志的来源一般有两个渠道:
1.1 苹果收集的Crash日志,可通过以下方法取得:
- 如果app关联了你的账号,则可以从“Xcode->Window->Organizer->Crashes”中获得;
- 如果是可以取得的手机,则连接电脑后,可以从“Xcode->Window->Devices and Simulators->View Device Logs”中获得;
- 如果是用户的手机,则可以从“设置->隐私->分析与改进->分析数据”中获得;
1.2 自己应用内收集的Crash日志,也分几种情况:
- 接入PLCrashReporter、KSCrash等SDK进行收集,然后上报到自建的后台;
- 接入APM产品,如Bugly、EMAS、mPaas、phabricator等;
2 如何查看Crash日志[2]
拿到一份Crash日志,应该如何查看呢?
下面以苹果收集的Crash日志为例(非苹果收集的Crash日志不一定都有这些字段,这个和收集的SDK有关)。
2.1 Crash日志布局
2.2 Header
Header描述Crash发生的环境,包括或部分包括下面这些字段:
Header部分所包含字段所代表的意思如下:
- Incident Identifier:Crash报告的唯一标识,不同的Crash报告永远不会有一样的Incident Identifier。
- CrashReport Key:每个设备的匿名标识,来自同一设备的不同Crash报告包含完全一样的值。擦除设备后此标识会重置。
- Beta Identifier:设备和应用提供者的联合唯一标识,来自同一提供者和同一设备的Crash报告包含完全一样的值。这个字段只会在TestFlight中代替CrashReportKey字段出现。
- Hardware Model:应用运行所在的特定设备型号。
- Precess:Crash的进程名,其值和plist中CGBundleExecutable的值一致,括号里面的是进程ID。
- Path:可执行文件在硬盘中的位置。在macOS中,为了保护隐私,会用占位符来代替此值。
- Identifier:Crash进程的CFBundleExecutable的值,如果二进制文件没有CFBundleIdentifier,则此字段包含进程名称或占位符值。
- Version:Crash进程的版本号,此值是应用的CFBundleExecutable与CFBundleShortVersionString的组合。
- AppStoreTools:用于编译应用程序并精简为特定设备版本的Xcode版本。
- AppVariant:精减应用时产生的特定变体,这个字段包含多个值。
- Code Type:Crash进程运行下的CPU架构,这个值是ARM-64, ARM, X86-64, X86中的一个。
- Role:终止时分