MetricKit MXCallStackTree 符号化

3

我正在尝试实现MetricKit,以便稍后可以分析MXCrashDiagnosticMXHangDiagnostic报告。然而,当我触发测试崩溃时,以下是我得到的MXCrashDiagnostic示例:

ente  "timeStampEnd": "2021-06-07 15:59:00 +0000",
"crashDiagnostics": [
  {
    "version": "1.0.0",
    "callStackTree": {
      "callStacks": [
        {
          "threadAttributed": true,
          "callStackRootFrames": [
            {
              "binaryUUID": "DC2EACEA-3D9C-3409-96C2-2DF9C89AD19D",
              "offsetIntoBinaryTextSegment": 6917586944,
              "sampleCount": 1,
              "subFrames": [
                {
                  "binaryUUID": "DC2EACEA-3D9C-3409-96C2-2DF9C89AD19D",
                  "offsetIntoBinaryTextSegment": 6917586944,
                  "sampleCount": 1,
                  "subFrames": [
                    {
                      "binaryUUID": "DC2EACEA-3D9C-3409-96C2-2DF9C89AD19D",
                      "offsetIntoBinaryTextSegment": 6917586944,
                      "sampleCount": 1,
                      "subFrames": [
                        {
                          "binaryUUID": "35463E49-9534-3644-B993-2A73C287A143",
                          "offsetIntoBinaryTextSegment": 4329963520,
                          "sampleCount": 1,
                          "binaryName": "demo",
                          "address": 4333717704
                          }]

我试图通过执行以下命令来解析数据:

atos -arch arm64e -o /Users/xxx/Downloads/\!dsym-4/demo.app.dSYM/Contents/Resources/DWARF/demo 4333717704

但我找不到崩溃堆栈,返回的结果是4333717704

DSYM文件的UUID为UUID: 35463E49-9534-3644-B993-2A73C287A143 (arm64) /Users/xxx/Downloads/!dsym-3/demo.app.dSYM/Contents/Resources/DWARF/demo

如何对MetricKit返回的堆栈进行符号化?

2个回答

2

好的,我并不惊讶你遇到了问题。我认为每个尝试对MetricKit数据进行符号化的人都会遇到问题。

原因是offsetIntoBinaryTextSegment字段命名不正确。它实际上是二进制加载地址!我花了很长时间才弄清楚这一点。我已经向苹果报告了一个错误,并建议你也这样做。(虽然我对此JSON结构实际上是一个API并不抱有太高的希望)

你需要做的是:

atos -arch ARCH -i -l <offsetIntoBinaryTextSegment> /path/to/dsym <address>

1
  1. 使用offsetIntoBinaryTextSegment字段代替addressMXCallStackTree解释了每个字段的含义。它告诉我们offsetIntoBinaryTextSegment是符号的地址,而address是内存中堆栈帧的地址。
  2. 将十进制转换为十六进制。 atos只接受十六进制地址。
  3. atos --help会告诉你需要两个地址参数。 -l后面的loadAddress是二进制镜像的加载地址,address是符号偏移量(offsetIntoBinaryTextSegment)+ loadAddress。请参见崩溃报告符号化。在MXCallStackTree中,我们不知道二进制镜像的加载地址,就像崩溃报告一样。但这并非必要。 atos只关心address - loadAddress == offsetIntoBinaryTextSegment。在你的情况下,一个技巧是loadAddress=0x1address=hex(offsetIntoBinaryTextSegment + 1)。因此,命令行应该是:0x102160000 = hex(4329963520)
atos -arch arm64e -o /Users/xxx/Downloads/!dsym-4/demo.app.dSYM/Contents/Resources/DWARF/demo 0x1 0x102160001

这个讨论可能对您有所帮助:https://developer.apple.com/forums/thread/681967


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接