我正在尝试实现MetricKit,以便稍后可以分析MXCrashDiagnostic
和MXHangDiagnostic
报告。然而,当我触发测试崩溃,然后执行Debug->Simulate MetricKit Payloads
时,我总是在dictionaryRepresentation()
中收到完全相同的结果。以下是MXCrashDiagnostic的示例:
[[AnyHashable("diagnosticMetaData"): {
appBuildVersion = 2;
appVersion = "1.0";
deviceType = "iPhone10,6";
exceptionCode = 0;
exceptionType = 1;
osVersion = "iPhone OS 14.0.1 (18A393)";
platformArchitecture = arm64;
regionFormat = CA;
signal = 11;
terminationReason = "Namespace SIGNAL, Code 0xb";
virtualMemoryRegionInfo = "0 is not in any region. Bytes before following region: 4000000000 REGION TYPE START - END [ VSIZE] PRT/MAX SHRMOD REGION DETAIL UNUSED SPACE AT START ---> __TEXT 0000000000000000-0000000000000000 [ 32K] r-x/r-x SM=COW ...pp/Test";
}, AnyHashable("callStackTree"): {
callStackPerThread = 1;
callStacks = (
{
callStackRootFrames = (
{
address = 74565;
binaryName = testBinaryName;
binaryUUID = "A36D6CF4-CBE8-4FB9-9DC4-C7EE8C6431CC";
offsetIntoBinaryTextSegment = 123;
sampleCount = 20;
}
);
threadAttributed = 1;
}
);
}, AnyHashable("version"): 1.0.0]]
对于cpuExceptionDiagnostics
和hangDiagnostics
,callStackTree
的值总是相同的。
我试图通过执行命令来象征数据:
1. cd /Path/To/Archive/myApp.xcarchive/dSYMs/myApp.app.dSYM/Contents/Resources/DWARF/
2. atos -arch arm64 -o myApp 0x00074565
但总是得到相同的结果:
atos[79918]: respawning is disabled (because DYLD_ROOT_PATH or DT_NO_RESPAWN is set), but the analysis process does not match the SDK variant of the target process 0.
Analysis of malloc zones may fail.
0x00074565 (in myApp)
我在网上没有发现任何关于警告的信息,也没有发现xcode中的任何参数我试着遵循这个和这个关于符号化过程的指南,也为这个问题提供了一些答案,但看起来我没有正确的符号化数据,尽管我确实正确地设置了报告。
如果有人能让我知道我遗漏了什么,以及如何正确地象征这些报告,我将不胜感激。
调试->模拟MetricKit有效负载这只是一个例子。这是atos无法象征的。
唯一的麻烦是从用户那里收集有效载荷。
我猜当您在XCODE中触发模拟metricKit有效载荷时,它将始终提供包含MXDiagnosticsPayload的相同阵列。
这里有一个关于在Apple开发者论坛上象征MetricKit崩溃报告的有用线索:https://developer.apple.com/forums/thread/681967
简而言之,对于您有dSYM的每个调用堆栈帧(可能只是您的应用程序(,获取offsetIntoBinaryTextSegment
并将其从十进制转换为十六进制。然后调用atos
,如下所示:
atos -arch arm64 -o <path to dSYM> 0x1 <offset in hex>
其中<offset in hex>
是从offsetIntoBinaryTextSegment
转换为十六进制的值。我在示例中使用了arm64
,假设这是一个iOS应用程序。
您还应该验证每帧中的binaryUUID
值是否与您提供给atos
的dSYM文件的UUID匹配。您可以使用dwarfdump
:获得这样的dSYM文件的UUID
dwarfdump --uuid <path to dSYM>