-->

在iOS的崩溃转储匹配了偏移二进制拆解(Matching up offsets in iOS cra

2019-07-29 09:30发布

我无法匹配了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的值和相应的内存地址之间的差异是由于指令流水线。我是假设 ,这种差异会考虑到报道的偏移在崩溃转储,或者无论如何,我会看到有问题的分支指令几条指令的一个两侧指出,如果这种差异并没有考虑...)

任何人都可以摆脱任何轻?

Answer 1:

只要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没有符号剥离出来。



Answer 2:

该虚拟地址添加__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在这个例子中)。 有关调用栈的最顶层的框架,这是应用程序崩溃的位置。 对于所有其它的水平,在所计算出的地址应该是对应于堆叠中的下一个较高等级的分支指令。



文章来源: Matching up offsets in iOS crash dump to disassembled binary
标签: ios otool