我很难将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的值与相应的内存地址之间存在差异。我假设在崩溃转储中报告的偏移量中会考虑到这样的差异,或者至少,如果没有考虑到这种差异,我会看到所涉及的分支指令中的几个指令。)
有人能给我点光吗?
发布于 2012-05-26 21:41:26
如果myapp没有去掉符号,您就可以使用atos了。
您可以通过man atos获取更多详细信息,但是对于您的问题来说,这应该足够了:
-o symbol_file # debugging information output by the compiler this may be a dSYM or the binary itself depending on who you saved symbol information
-l load address # the base address in the process space at which your library is loaded into the springboard process (Looks like 0x1000)
Also a list of addresses you wish to symbolicate
Usage:
atos -o myapp -l 0x1000 0x00005b0a 0x0005bca ... etc该输出应该是终端的符号名列表。同样,这要求myapp没有去掉符号。
发布于 2013-09-30 20:11:39
将__TEXT段的虚拟地址添加到崩溃转储中给定的相对地址。结果是要在反汇编中查找的地址。以下是几个步骤:
otool -lv <application-binary>从应用程序二进制转储加载命令。查找__TEXT段的load命令和vmaddr (通常是0x1000 )的关联值。您不需要上面所示的有关__text部分的信息,只需要有关崩溃转储中的段.0x00124ff4 0xf4000 + 200692形式给出的。最后一部分是十进制二进制内的偏移量。将其添加到步骤1中获得的值并转换为十六进制。在本例中,我们将计算0x1000 + 200692,即十六进制中的0x31ff4。otool -tV <application-binary>来转储应用程序二进制的反汇编。定位步骤2中获得的地址(本例中为0x31ff4)。对于调用堆栈的最顶层帧,这是应用程序崩溃的地方。对于所有其他级别,计算出的地址应该是一个分支指令,它对应于堆栈中下一个更高的级别.。
https://stackoverflow.com/questions/10578155
复制相似问题