文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

iOS 使用 Metrickit 收集崩溃日志

2024-12-02 01:41

关注

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

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

Metrickit 缺陷

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

开始接入

1.添加 MetricKit

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总格式

crashDiagnostics 详情

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

diagnosticMetaData 字典详情

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

callStackTree 字典详情

callStacks 数组详情

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

callStackRootFrames 数组详情

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

diskWriteExceptionDiagnostics 详情

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

diagnosticMetaData 字典详情

callStackTree 字典详情

callStacks 数组详情

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

callStackRootFrames 数组详情

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

cpuExceptionDiagnostics 详情

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

diagnosticMetaData 字典详情

callStackTree 字典详情

callStacks 数组详情

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

callStackRootFrames 数组详情

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

hangDiagnostics 详情

diagnosticMetaData 字典详情

callStackTree 字典详情

callStacks 数组详情


callStackRootFrames 数组详情

来源:Swift社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯