coredump中添加oat文件的方法

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

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

时间: 2024-08-07 14:55:12

coredump中添加oat文件的方法的相关文章

VS中添加预处理宏的方法

VS中添加预处理宏的方法 除了在.c及.h中添加宏定义之外,还可以采用如下方法添加宏定义: 1.若只需要定义一个宏(如#define DEBUG),可以右键点击工程-->属性-->c/c++-->预处理器-->预处理器定义,点击下拉框中的编辑,输入想要定义的宏: 2.如果还需要定义宏的内容(如#define inline __inline),可以右键点击工程-->属性-->c/c++-->命令行,在其它选项中输入如下内容: /D"inline"

yii2中添加验证码的实现方法

本文实例讲述了yii2中添加验证码的实现方法.分享给大家供大家参考,具体如下: 首先,在模型中添加验证码字段: ? 1 2 3 public function rules(){ return ['verifyCode', 'captcha'], } 其次,可以在函数attributeLabels中添加前台页面中验证码的字段名称: ? 1 2 3 public function atrributeLabels(){ return ['verifyCode'=>'Verification Code'

在html中添加script脚本的方法和注意事项

在html中添加script脚本有两种方法,直接将javascript代码添加到html中与添加外部js文件,这两种方法都比较常用,大家可以根据自己需要自由选择 在html中添加<script>脚本的方法: 1.可以直接将javascript代码添加到html中 <script type="text/javascript"> //javascritp代码 </script> 当解释器嵌入<script>代码时,html页面的处理也会被暂时

在vs2008中添加lib文件以及一些常用项目设置选项

下面以添加ws2_32.lib文件为例 方法一(直接添加代码): 直接在.cpp文件中,添加#pragma comment(lib, "ws2_32.lib");即可.(ws2_32.lib即为你要添加的lib文件) 方法二(在vs工具栏中添加): 1.项目(project) -> TcpSrv属性(TcpSrv properties) (其中TcpSrv为工程名) 2.打开TcpSrv属性页后,配置属性 -> 链接器(linker) -> 输入(Input) ,在附

Qt中添加背景图片的方法

Qt中添加背景图片的方法 1. QPalette的方法 #include <QApplication>#include <QtGui> int main(int argc, char *argv[]){    QApplication app(argc,argv);        QFrame *frame = new QFrame;    frame->resize(400,700);    QPixmap pixmap("images/frame.png&quo

详解VMware 虚拟机中添加新硬盘的方法

一.VMware新增磁盘的设置步骤 (建议:在设置虚拟的时候,不要运行虚拟机的系统,不然添加了新的虚拟磁盘则要重启虚拟机) 1.选择“VM”----“设置”并打开,将光标定位在“硬盘(SCSI)”这一选项,然后点击下方的“添加”按钮 2.点击下一步,执行下一个步骤 3.选择磁盘类型 4.根据提示,创建一个虚拟的磁盘,并点击下一步 5.设置磁盘大小,点击下一步 6.选择存储位置,最后点击完成 以下是对虚拟机中Linux和widows中对于新的虚拟磁盘的挂载的方式的介绍 二.虚拟机中windows对

Linux中逐行读取文件的方法

  Linux中逐行读取文件的方法             在linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法.为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率. 方法1:while循环中执行效率最高,最常用的方法. function while_read_LINE_bottm(){ While read LINE do echo $LINE done   < $FILENAME } 注释:我习惯把

网页中添加下划线的方法汇总及优缺点

本文主要介绍了添加下划线样式的几乎所有方法,并且比较了每一种方法的优缺点.没想到之前一直没有注意的下划线还有这么多玄机奥秘! 本文由 nzbin 翻译,艾凌风 校稿.未经许可,禁止转载! 英文出处:css-tricks.com 发表地址:http://web.jobbole.com/89425/ 有很多种添加下划线样式的方法.可能你还记得< Crafting link underlines on Medium >这篇文章.Medium 并没有尝试特殊的方法,只是想创建一个漂亮的看起来正常的下划

php中读取大文件实现方法详解

php中读取大文件实现方法详解 来源:   时间:2013-09-05 19:27:01   阅读数:6186 分享到:0 [导读] 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解的同学可进入参考参考.需求如下: 现有一个1G左右的日志文件,大约有500多万行, 用php返回最后几行的内容.实现方法:1 直接采用file函数 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解的同学可进入参考参考. 需求如下: 现有一个1G左右的日志文件,大约有500多万行,