我无法将 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 的值与相应的内存地址之间存在差异。我假设在报告的偏移量中会考虑这种差异在故障转储中,或者无论如何,如果没有考虑到这种差异,我会看到有问题的分支指令,它的任一侧都指向了一些指令......)
任何人都可以解释一下吗?