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