zoukankan      html  css  js  c++  java
  • coredump中添加oat文件的方法

    coredump默认不会dump文件映射,

    而我们如果要调试oat问题,需要将boot.oat等文件直接加载到core文件里。

    这样就能方便的在gdb中查询oat文件中的内容了。

    本文将介绍如何将一个file添加到core文件中。

    首先我们需要三个文件,分别是core文件、maps文件、oat文件。

    步骤1:

    将oat文件追加到core文件里

    $ cat system@framework@boot.oat >> core-Heap thread poo-3961

    步骤2:

    从maps文件中找到oat文件的加载地址

    70c51000-7340a000 r--p 00000000 b3:17 1179652    /data/dalvik-cache/arm/system@framework@boot.oat
    7340a000-739d6000 r-xp 027b9000 b3:17 1179652    /data/dalvik-cache/arm/system@framework@boot.oat
    739d6000-739d7000 r-xp 02d85000 b3:17 1179652    /data/dalvik-cache/arm/system@framework@boot.oat
    ...
    75160000-75163000 r-xp 0450f000 b3:17 1179652    /data/dalvik-cache/arm/system@framework@boot.oat
    75163000-752e1000 r-xp 04512000 b3:17 1179652    /data/dalvik-cache/arm/system@framework@boot.oat
    752e1000-752e2000 rw-p 04690000 b3:17 1179652    /data/dalvik-cache/arm/system@framework@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
       ...

    这种虽然挺麻烦的,但是个通用的方法,而且上面的这些完全可以用脚本或工具做,有空再研究。

  • 相关阅读:
    Hadoop学习之编译eclipse插件
    js堆栈溢出错误
    java——推断日期是否在今天之前
    AlertDialog.Builder中的setMultiChoiceItems中的事件处理
    Qemu之Network Device全虚拟方案二:虚拟网卡的创建
    【Android Tricks 6】ViewPager首页与尾页的滑动动作响应
    JFinal开发web项目出现故障小记
    HDU-4407-Sum(容斥原理)
    自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令
    待字闺中之巧妙排序分析:
  • 原文地址:https://www.cnblogs.com/YYPapa/p/6851187.html
Copyright © 2011-2022 走看看