coredump中提取oat文件的方法

boot.oat是文件映射,所以coredump默认情况下是不会dump如boot.oat这种文件映射的。

但我们可以通过设置/proc/{pid}/coredump_filter的值,也可以将boot.oat dump到core文件中。

我们有了完整的内存镜像后,可以用gdb方便的访问文件镜像的内容了。

并且我们也能从coredump中再把boot.oat给提取出来,再用oatdump等工具做分析。

下面就写写如何从coredump中提取boot.oat的。

 

首先,我们可以通过maps确定boot.oat的加载地址:

32c01000-52c00000 ---p 00001000 00:04 11621      /dev/ashmem/dalvik-main space 1 (deleted)
6f5ed000-700f5000 rw-p 00000000 b3:19 73733      /data/dalvik-cache/arm/system@framework@boot.art
700f5000-72535000 r--p 00000000 b3:19 73732      /data/dalvik-cache/arm/system@framework@boot.oat
72535000-72c7d000 r-xp 02440000 b3:19 73732      /data/dalvik-cache/arm/system@framework@boot.oat
72c7d000-72c7f000 r-xp 02b88000 b3:19 73732      /data/dalvik-cache/arm/system@framework@boot.oat
72c7f000-72cf9000 r-xp 02b8a000 b3:19 73732      /data/dalvik-cache/arm/system@framework@boot.oat
...
73eab000-7401c000 r-xp 03db6000 b3:19 73732      /data/dalvik-cache/arm/system@framework@boot.oat
7401c000-7401d000 rw-p 03f27000 b3:19 73732      /data/dalvik-cache/arm/system@framework@boot.oat
7401d000-7416b000 rw-p 00000000 00:04 11619      /dev/ashmem/dalvik-zygote space (deleted)

它的起始地址是0x700f5000,结束地址是0x7401d000,大小是0x7401d000-0x700f5000=0x3f28000

 

gdb的dump memory命令:

(gdb) dump memory boot.oat 0x700f5000 0x7401d000

 

这个命令在工作目录下生成boot.oat文件,我们可以用oatdump工具解析这个文件。

$ out/host/linux-x86/bin/oatdump  --oat-file=boot.oat --output=boot.oat.txt

 

posted @ 2017-05-14 00:40  YYPapa  阅读(1571)  评论(0编辑  收藏  举报