我无法将 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
段到故障转储中给出的相对地址。结果是要在反汇编中查找的地址。步骤如下:
Use otool -lv <application-binary>
转储来自的加载命令
应用程序二进制文件。查找加载命令__TEXT
段和相关值vmaddr
, 通常0x1000
。您不需要有关的信息__text
section上面显示的只是有关的信息segment.
在故障转储中,调用堆栈中的地址以以下形式给出0x00124ff4 0xf4000 + 200692
。最后一部分是二进制文件中的偏移量十进制。将其添加到步骤 1 中获得的值并转换为十六进制。在这个例子中,我们将计算0x1000 + 200692
这是0x31ff4
in hex.
Use otool -tV <application-binary>
转储应用程序二进制文件的反汇编代码。找到步骤 2 中获得的地址(0x31ff4
在此示例中)。对于调用堆栈的最顶层框架,这是应用程序崩溃的地方。对于所有其他级别,计算出的地址处应该有一条分支指令,该指令对应于堆栈中的下一个更高级别。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)