将iOS崩溃转储中的偏移量匹配到反汇编的二进制文件
我在匹配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的指令,这与所讨论的实际指令是一致的(包括这样一个事实,例如进一步向下的位置不指向分支指令)。
(我知道,至less在ARM的早期版本中,由于指令stream水线,PC的值和相应的存储器地址之间存在差异,我假定在报告的偏移量中会考虑到这种差异在崩溃转储中,或者无论如何,如果没有考虑到这种差异,我会看到有关的分支指令中有一条指令的任何一边的指令。)
任何人都可以摆脱灯光吗?
假设myapp
没有atos
符号,你可以使用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
该输出应该是terminal的符号名称列表。 同样,这要求myapp
没有删除符号。
将__TEXT
段的虚拟地址添加到崩溃转储中给定的相对地址。 结果是在反汇编中查找的地址。 这里是步骤:
-
使用
otool -lv <application-binary>
转储来自应用程序二进制文件的加载命令。 查找__TEXT
段的加载命令和vmaddr
的关联值(通常为0x1000
。 您不需要上面显示的关于__text
部分的信息,只需要关于该部分的信息。 -
在崩溃转储中,调用堆栈中的地址以
0x00124ff4 0xf4000 + 200692
的forms0x00124ff4 0xf4000 + 200692
。 最后一部分是十进制二进制内的偏移量。 将其添加到步骤1中获得的值并转换为hex。 在这个例子中,我们将计算0x1000 + 200692
,它是hex的0x31ff4
。 -
使用
otool -tV <application-binary>
转储应用程序二进制文件的反汇编。 find步骤2中获得的地址(本例中为0x31ff4
)。 对于调用堆栈的最顶层框架,这是应用程序崩溃的地方。 对于所有其他级别,计算出的地址应该是一个分支指令,它对应于堆栈中的下一个更高级别。