将 iOS 崩溃转储中的偏移量与反汇编的二进制文件相匹配

2023-12-24

我无法将 iOS 崩溃转储的堆栈跟踪中的偏移量与 otool 输出的二进制文件反汇编中的偏移量进行匹配。

任何人都可以确认我原则上如何匹配这些。例如,如果我在故障转储中得到一行:

0 myapp  0x00005b0a  0x1000 + 19210

我是否期望二进制文件中违规指令的偏移量为 0x5b0a、0x4b0a.... 还是其他?

例如,在对标头信息进行解码时,otool 还给出了以下信息(实际代码从文件中的偏移量 0x0000224c 开始):

Section
  sectname __text
   segname __TEXT
      addr 0x0000224c
      size 0x00063ad2
    offset 4684
     align 2^2 (4)
    reloff 0
    nreloc 0
      type S_REGULAR
attributes PURE_INSTRUCTIONS SOME_INSTRUCTIONS
 reserved1 0
 reserved2 0

所以,我不能 100% 确定我的解释正确,但似乎是说文件中 +0x224c 处的代码最终位于内存中的偏移量 0x124c 处,但后来我不太确定这是如何实现的例如,适合位置 0x1000。

我遇到的问题是,假设偏移量 0x5b0a,那里的指令、0x4b0a 处的指令和 0x6b0a 处的指令都没有意义作为实际的指令(包括这样的事实,例如堆栈中更靠下的位置不指向分支指令)。

(我知道,至少在 ARM 的早期版本中,由于指令管道的原因,PC 的值与相应的内存地址之间存在差异。我是assuming在崩溃转储中报告的偏移量中将考虑到这种差异,或者无论如何,如果没有考虑到这种差异,我会看到相关分支指令的两侧都有一些指令指向考虑到...)

有人能透露一下吗?


添加虚拟地址__TEXT段到故障转储中给出的相对地址。结果是要在反汇编中查找的地址。步骤如下:

  1. Use otool -lv <application-binary>转储来自的加载命令 应用程序二进制文件。查找加载命令__TEXT段和相关值vmaddr, 通常0x1000。您不需要有关的信息__text section上面显示的只是有关的信息segment.

  2. 在故障转储中,调用堆栈中的地址以以下形式给出0x00124ff4 0xf4000 + 200692。最后一部分是二进制文件中的偏移量十进制。将其添加到步骤 1 中获得的值并转换为十六进制。在这个例子中,我们将计算0x1000 + 200692这是0x31ff4 in hex.

  3. Use otool -tV <application-binary>转储应用程序二进制文件的反汇编代码。找到步骤 2 中获得的地址(0x31ff4在此示例中)。对于调用堆栈的最顶层框架,这是应用程序崩溃的地方。对于所有其他级别,计算出的地址处应该有一条分支指令,该指令对应于堆栈中的下一个更高级别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 iOS 崩溃转储中的偏移量与反汇编的二进制文件相匹配 的相关文章

随机推荐