将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段的虚拟地址添加到崩溃转储中给定的相对地址。 结果是在反汇编中查找的地址。 这里是步骤:

  1. 使用otool -lv <application-binary>转储来自应用程序二进制文件的加载命令。 查找__TEXT段的加载命令和vmaddr的关联值(通常为0x1000 。 您不需要上面显示的关于__text 部分的信息,只需要关于该部分的信息。

  2. 在崩溃转储中,调用堆栈中的地址以0x00124ff4 0xf4000 + 200692的forms0x00124ff4 0xf4000 + 200692 。 最后一部分是十进制二进制内的偏移量。 将其添加到步骤1中获得的值并转换为hex。 在这个例子中,我们将计算0x1000 + 200692 ,它是hex的0x31ff4

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