匹配iOS崩溃转储中的偏移到反汇编的二进制文件

时间:2012-05-14 06:05:11

标签: ios otool

我无法将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的指令都没有意义,因为它是有问题的实际指令(包括例如位于堆栈下方的位置然后' t指向分支指令)。

(我知道,至少在ARM的早期版本中,由于指令管道,PC的值与相应的内存地址之间存在差异。我假设这样的在崩溃转储中报告的偏移量中会考虑到差异,或者无论如何,我会看到有问题的分支指令,如果没有考虑到这种差异,那么指向该指令的任何一侧的指令。 ..)

任何人都可以放弃任何光线吗?

2 个答案:

答案 0 :(得分:5)

__TEXT段的虚拟地址添加到崩溃转储中给出的相对地址。结果是在反汇编中查找的地址。以下是步骤:

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

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

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

答案 1 :(得分:2)

如果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没有删除符号。

相关问题