IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> iOS使用 Metrickit 收集崩溃日志 -> 正文阅读

[游戏开发]iOS使用 Metrickit 收集崩溃日志

iOS使用 Metrickit 收集崩溃日志

Metrickit 是什么

MetricKit 是 苹果在 iOS13系统开始引入的用来汇总和分析有关异常和崩溃诊断以及电源和性能指标的每个设备的报告。

为什么要用 MetricKit 收集崩溃日志

当前市面上的开源框架,如 KSCrash,PLCrashReport 等框架都有一些崩溃不能抓取;比如PLCrashReport 不能抓取栈溢出的崩溃,不能抓取SIGKILL, SIGQUIT等信号量的崩溃。KSCrash 对SIGKILL的崩溃抓取也只能抓取一部分

Metrickit 缺陷

1.目前只支持 iOS14 以后的崩溃日志收集

2.崩溃日志没有返回具体的崩溃时间和启动时间,崩溃场景信息除了堆栈外没有其余信息

3.如果使用了段迁移编译技术,主程序 macho 的地址和 uuid 无法匹配。

iOS14的崩溃日志是24小时会回调通知一次,时效性低;iOS15 之后,崩溃日志会在下次启动之后就返回,但经验证,有的会立即回调,有的则不然,规律不可琢磨

开始接入

1.添加 MetricKit

Metrkit.png

2.添加 MetricKit 监听者


if (@available(iOS 14.0, *)) {

        MXMetricManager *manager = [MXMetricManager sharedManager];

        if (self && manager && [manager respondsToSelector:@selector(addSubscriber:)]) {

            [manager addSubscriber:self];

        }

    }    

3. 监听者实现 MXMetricManagerSubscriber 协议方法, payloadDic 里面包含着上次本应用发生的崩溃日志堆栈和信息


  // 苹果如果有数据数据,注册监听之后就会回调

- (void)didReceiveDiagnosticPayloads:(NSArray<MXDiagnosticPayload *> * _Nonnull)payloads  API_AVAILABLE(ios(14.0)){

    if (@available(iOS 14.0, *)) {

        for (MXDiagnosticPayload *payload in payloads) {

                NSDictionary *payloadDic = [payload dictionaryRepresentation];

                

            });

        }

    }

}

4.日志组装关键代码示例


NSArray *callStackRootFrames = [dicFrame  ArrayValueForKey:kMetrkitCallStackRootFramesKey];

            if (callStackRootFrames.count <= 0) {

                continue;

            }

            NSDictionary *dicZero = [callStackRootFrames ObjectAtIndex:0];

            int rootIndex = 0;

            while (dicZero && dicZero.count > 0) {

                NSString *binaryUUID = [dicZero   stringValueForKey:kMetrkitBinaryUUIDKey];

                NSString *binaryName = [dicZero   stringValueForKey:kMetrkitBinaryNameKey];

                long long baseAdd = [[dicZero NumberValueForKey:kMetrkitOffsetIntoBinaryTextSegmentKey] longLongValue];

                long long address = [[dicZero  numberValueForKey:kMetrkitAddressKey] longLongValue];

                NSArray *subFrames = [dicZero  arrayValueForKey:kMetrkitSubFramesKey];

                [strStack appendFormat:@"%d %@ 0x%llx 0x%llx + %lld\n", rootIndex, binaryName, baseAdd, address, address - model.baseAddress];

                rootIndex++;

                if (subFrames && subFrames.count >= 0) {

                    dicZero = [subFrames  ObjectAtIndex:0];

                } else {

                    dicZero = nil;

                }

         

MetricKit 返回字段含义及详情

JSON总格式

key值类型解释demo值
crashDiagnosticsArray记录的崩溃见下面详情
hangDiagnosticsArray记录的卡顿信息见下面详情
cpuExceptionDiagnosticsArray记录的cpu异常信息见下面详情
diskWriteExceptionDiagnosticsArray记录的磁盘写入异常信息见下面详情
timeStampBeginDate记录事件开始间隔2021-12-01 09:06:57 +0000
timeStampEndDate记录事件结束间隔2021-12-01 09:06:57 +0000

crashDiagnostics 详情

每一个崩溃为一个字典,具体内容为下

key值类型解释demo值
versionStringMetrkit 框架版本1.0.0
diagnosticMetaData字典崩溃的一些核心信息(含App信息)见二级详情
callStackTree字典堆栈相关信息见二级详情

diagnosticMetaData 字典详情

key值类型解释demo值
appBuildVersionStringbuild12.29.0.1
appVersionStringapp 版本12.29.0
regionFormatString区域代码CN
exceptionTypeString异常类型1
osVersionStringiOS 操作系统iPhone OS 15.1 (19B74)
deviceTypeStringModeliPhone13,1
bundleIdentifierStringbundlecom.xxx.xxxxx
exceptionCodeStringexception Code1
signalString信号量符号11
platformArchitectureStringcpu 架构arm64e
virtualMemoryRegionInfoString虚拟内存信息0x10 is not in any region. Bytes before following region: 433969560 REGION TYPE START- END [ VSIZE] PRT/MAX SHRMOD REGION DETAIL UNUSED SPACE AT START—> __**TEXT 102aa8000-11012c000 [214.5M] r-x/r-x SM=COW …p/xxxxx

|terminationReason|String|崩溃原因| RBSTerminateContext domain:10 code:0x8BADF00D explanation:scene-update watchdog transgression: application<com.xxx.xxxx> :6308 exhausted real (wall clock) time allowance of 10.00 seconds|

callStackTree 字典详情

key值类型解释demo值
callStacksArray每个线程详细堆栈见三级详情
callStackPerThreadBOOL是否只收集单线程见二级详情

callStacks 数组详情

数组中元素为字典,详情如下

key值类型解释demo值
threadAttributedBOOL是否是崩溃线程true
callStackRootFramesArray单线程堆栈详细信息见下一级级详情

callStackRootFrames 数组详情

数组中元素为字典,详情如下

key值类型解释demo值
binaryUUIDStringuuidDC6B1885-FB91-34C4-A9FC-A539C17A08A7
offsetIntoBinaryTextSegmentint基于二进制macho的偏移,十进制4339695616
sampleCountint未知1
binaryNameString二进制macho的名称xxx
addressint二进制macho的基址4446737180
subFramesArray诱发此次崩溃的上一级线程有可能循环递归callStackRootFrames内容

diskWriteExceptionDiagnostics 详情

每一个崩溃为一个字典,具体内容为下

key值类型解释demo值
versionStringMetrkit 框架版本1.0.0
diagnosticMetaData字典崩溃的一些核心信息(含App信息)见二级详情
callStackTree字典堆栈相关信息见二级详情

diagnosticMetaData 字典详情

key值类型解释demo值
appBuildVersionStringbuild12.29.0.1
appVersionStringapp 版本12.29.0
regionFormatString区域代码CN
osVersionStringiOS 操作系统iPhone OS 15.1 (19B74)
deviceTypeStringModeliPhone13,1
bundleIdentifierStringbundlecom.xxx
writesCausedString写原因2,000字节
platformArchitectureStringcpu 架构arm64e

callStackTree 字典详情

key值类型解释demo值
callStacksArray每个线程详细堆栈见三级详情
callStackPerThreadBOOL是否只收集单线程见二级详情

callStacks 数组详情

数组中元素为字典,详情如下

key值类型解释demo值
threadAttributedBOOL是否是触发线程true
callStackRootFramesArray单线程堆栈详细信息见下一级级详情

callStackRootFrames 数组详情

数组中元素为字典,详情如下

key值类型解释demo值
binaryUUIDStringuuidDC6B1885-FB91-34C4-A9FC-A539C17A08A7
offsetIntoBinaryTextSegmentint基于二进制macho的偏移,十进制4339695616
sampleCountint未知1
binaryNameString二进制macho的名称xxxxx
addressint二进制macho的基址4446737180
subFramesArray诱发此次崩溃的上一级线程有可能循环递归callStackRootFrames内容

cpuExceptionDiagnostics 详情

每一个崩溃为一个字典,具体内容为下

key值类型解释demo值
versionStringMetrkit 框架版本1.0.0
diagnosticMetaData字典崩溃的一些核心信息(含App信息)见二级详情
callStackTree字典堆栈相关信息见二级详情

diagnosticMetaData 字典详情

key值类型解释demo值
appBuildVersionStringbuild12.29.0.1
appVersionStringapp 版本12.29.0
regionFormatString区域代码CN
osVersionStringiOS 操作系统iPhone OS 15.1 (19B74)
deviceTypeStringModeliPhone13,1
bundleIdentifierStringbundlecom.xxx
totalCPUTimeStringcpu时间20s
totalSampledTimeStringCPU总采样时间20s
platformArchitectureStringcpu 架构arm64e

callStackTree 字典详情

key值类型解释demo值
callStacksArray每个线程详细堆栈见三级详情
callStackPerThreadBOOL是否只收集单线程见二级详情

callStacks 数组详情

数组中元素为字典,详情如下

key值类型解释demo值
threadAttributedBOOL是否是触发线程true
callStackRootFramesArray单线程堆栈详细信息见下一级级详情

callStackRootFrames 数组详情

数组中元素为字典,详情如下

key值类型解释demo值
binaryUUIDStringuuidDC6B1885-FB91-34C4-A9FC-A539C17A08A7
offsetIntoBinaryTextSegmentint基于二进制macho的偏移,十进制4339695616
sampleCountint未知1
binaryNameString二进制macho的名称xxxxx
addressint二进制macho的基址4446737180
subFramesArray诱发此次崩溃的上一级线程有可能循环递归callStackRootFrames内容

hangDiagnostics 详情

每一个崩溃为一个字典,具体内容为下

key值类型解释demo值
versionStringMetrkit 框架版本1.0.0
diagnosticMetaData字典崩溃的一些核心信息(含App信息)见二级详情
callStackTree字典堆栈相关信息见二级详情

diagnosticMetaData 字典详情

key值类型解释demo值
appBuildVersionStringbuild12.29.0.1
appVersionStringapp 版本12.29.0
regionFormatString区域代码CN
osVersionStringiOS 操作系统iPhone OS 15.1 (19B74)
deviceTypeStringModeliPhone13,1
bundleIdentifierStringbundlecom.xxx
hangDurationString卡顿时间20s
platformArchitectureStringcpu 架构arm64e

callStackTree 字典详情

key值类型解释demo值
callStacksArray每个线程详细堆栈见三级详情
callStackPerThreadBOOL是否只收集单线程见二级详情

callStacks 数组详情

数组中元素为字典,详情如下

key值类型解释demo值
threadAttributedBOOL是否是触发线程true
callStackRootFramesArray单线程堆栈详细信息见下一级级详情

callStackRootFrames 数组详情

数组中元素为字典,详情如下

key值类型解释demo值
binaryUUIDStringuuidDC6B1885-FB91-34C4-A9FC-A539C17A08A7
offsetIntoBinaryTextSegmentint基于二进制macho的偏移,十进制4339695616
sampleCountint未知1
binaryNameString二进制macho的名称xxxxx
addressint二进制macho的基址4446737180
subFramesArray诱发此次崩溃的上一级线程有可能循环递归callStackRootFrames内容
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 18:15:32  更:2022-04-18 18:17:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:05:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码