1. 程式人生 > >coredump中添加oat文件的方法

coredump中添加oat文件的方法

ldr pro cat 結束 sass 偏移 rom oat starting

coredump默認不會dump文件映射,

而我們如果要調試oat問題,需要將boot.oat等文件直接加載到core文件裏。

這樣就能方便的在gdb中查詢oat文件中的內容了。

本文將介紹如何將一個file添加到core文件中。

首先我們需要三個文件,分別是core文件、maps文件、oat文件。

步驟1:

將oat文件追加到core文件裏

$ cat [email protected]@boot.oat >> core-Heap thread poo-3961

步驟2:

從maps文件中找到oat文件的加載地址

70c51000-7340a000 r--p 00000000 b3:17 1179652    [email protected]
/* */@boot.oat 7340a000-739d6000 r-xp 027b9000 b3:17 1179652 [email protected]@boot.oat 739d6000-739d7000 r-xp 02d85000 b3:17 1179652 [email protected]@boot.oat ... 75160000-75163000 r-xp 0450f000 b3:17 1179652 [email protected]@boot.oat 75163000-752e1000 r-xp 04512000 b3:17 1179652 [email protected]
@boot.oat 752e1000-752e2000 rw-p 04690000 b3:17 1179652 [email protected]@boot.oat

起始點是70c51000

結束點是752e1000

大小是752e1000 - 70c51000 = 4690000

步驟3:

修改core文件的program header段

$ readelf -l core-Heap thread poo-3961

Elf file type is CORE (Core file)
Entry point 0x0
There are 1073 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  NOTE           0x008654 0x00000000 0x00000000 0x04c7c 0x00000     0
  LOAD           0x00e000 0x12c00000 0x00000000 0x201000 0x201000 RW  0x1000
  LOAD           0x20f000 0x12e01000 0x00000000 0x3ee000 0x3ee000 RW  0x1000
  LOAD           0x5fd000 0x131ef000 0x00000000 0xfa11000 0xfa11000     0x1000
  ...
  LOAD           0x1c447000 0xbe01f000 0x00000000 0x01000 0x01000     0x1000
  LOAD           0x1c448000 0xbe020000 0x00000000 0x7ff000 0x7ff000 RW  0x1000
  LOAD           0x1cc47000 0xffff0000 0x00000000 0x01000 0x01000 R E 0x1000

我們要改掉最後一個LOAD段,因為這個段是vector段,一般我們調試時用不到。

我們要替換成boot.oat的地址:

  LOAD           0x1cc48000 0x70c51000 0x00000000 0x04690000 0x04690000 R E 0x1000

如何替換呢?我是用hex editor工具修改core文件的。

首先找到LOAD段的文件內偏移:計算公式是program_headers_start + sizeof(entry)*count

其中program_headers_start是program_header的起始位置:52字節;

sizeof(entry)是每個LOAD段的大小:32字節;

count是LOAD段的個數:1073 - 1 =1072。

這樣vector的LOAD段的文件內偏移為52+32*1072=34356 = 0x8634

對應內容為

01 00 00 00 00 70 C4 1C 00 00 FF FF 00 00 00 00 00 10 00 00 00 10 00 00 05 00 00 00 00 10 00 00

修改成:

01 00 00 00 00 80 C4 1C 00 10 C5 70 00 00 00 00 00 00 69 04 00 00 69 04 05 00 00 00 00 10 00 00

這樣就ok了。

(gdb) disassemble 0x73af41f0,+0x1000
Dump of assembler code from 0x73af41f0 to 0x73af51f0:
   0x73af41f0:    stmdb    sp!, {r5, r6, r7, r8, lr}
   0x73af41f4:    sub    sp, #28
   0x73af41f6:    adds    r6, r0, #0
   0x73af41f8:    str    r0, [sp, #0]
   0x73af41fa:    mov    r8, r1
   0x73af41fc:    ldr.w    r0, [pc, #60]    ; 0x73af423c
   0x73af4200:    ldr.w    lr, [r9, #300]    ; 0x12c
   0x73af4204:    adds    r1, r6, #0
   0x73af4206:    blx    lr
   0x73af4208:    ldr.w    r7, [r8, #8]
   0x73af420c:    ldr.w    lr, [pc, #36]    ; 0x73af4234
   ...

這種雖然挺麻煩的,但是個通用的方法,而且上面的這些完全可以用腳本或工具做,有空再研究。

coredump中添加oat文件的方法