[Android][Kernel]基于crash工具搭建分析ramdump的平台

[Android][Kernel]使用crash工具分析ramdump

前言

本篇只讨论如下内容:

1、crash工具下载、编译

2、crash工具使用需要的文件、数据

3、crash工具使用需要传递的参数

本篇不讨论如下内容:

1、crash分析ramdump的指令 —— 后续可能会写

2、kaslr的作用 —— 这个网上很多了

3、内存地址偏移量的含义 —— 这个网上也不少

总之一句话,本篇只讲怎么搭建平台,至于怎么用,怎么分析问题,本篇概不讨论

下载crash工具:

github官网:https://github.com/crash-utility/crash

我们直接下载release即可:https://github.com/crash-utility/crash/archive/7.2.7.zip

(注意:7.2.9可能导致解析ramdump失败,原因不明,因此建议使用7.2.7)

7.2.9报错如下:

/var/tmp/ramdump_elf_N7LVjZ: ELF header read: No such file or directory
crash: malformed ELF file: /var/tmp/ramdump_elf_N7LVjZ
 

编译crash工具:

解析64位Android kernel使用如下指令编译:

make target=ARM64

期间会下载gdb,请保证网络畅通,或者手动下载(http://ftp.gnu.org/gnu/gdb/gdb-7.6.tar.gz)后放到crash所在目录中;

需要下载的文件:

gdb-7.6.tar.gz

gdb-7.6.patch

 

获取vmlinux文件

通常存在于out/target/product/<$project>/obj/KERNEL_OBJ/vmlinux

 

使用工具抓取ramdump

此次是高通手机,ramdump可以直接通过QPST抓取,抓取完成后目录下内容如下:

$ ls Port_COM19/
CD_BTDDR.BIN  CODERAM.BIN   DDRCS0_0.BIN  dump_info.txt  IPA_HRAM.BIN  IPA_SRAM.BIN  MSGRAM11.BIN  MSGRAM15.BIN  MSGRAM4.BIN  MSGRAM8.BIN   PARTBIN1.BIN  PMON_HIS.BIN
CD_BTIMM.BIN  DATARAM.BIN   DDRCS1_0.BIN  FSM_CTRL.BIN     IPA_IU.BIN    load.cmm      MSGRAM12.BIN  MSGRAM1.BIN     MSGRAM5.BIN  MSGRAM9.BIN   PARTBIN2.BIN  RST_STAT.BIN
CD_SHIMM.BIN  DCC_CFG.BIN   DDRCS1_1.BIN  FSM_STS.BIN     IPA_MBOX.BIN  MSGRAM0.BIN   MSGRAM13.BIN  MSGRAM2.BIN     MSGRAM6.BIN  OCIMEM.BIN    PIMEM.BIN      SHRM_MEM.BIN
CD_STRCT.BIN  DCC_SRAM.BIN  DDR_DATA.BIN  IPA_GSI.BIN     IPA_SEQ.BIN   MSGRAM10.BIN  MSGRAM14.BIN  MSGRAM3.BIN     MSGRAM7.BIN  PARTBIN0.BIN  PMIC_PON.BIN  SN_C6D6B790

加粗文件是此次需要的;

 

获取kaslr

无视网上各种hexdump -s 偏移位的指令(偏移位并不好确认),此处指令简单粗暴:

使用指令hexdump OCIMEM.BIN | grep dead 可以看到类似如下内容:

$ hexdump Port_COM19/OCIMEM.BIN | grep dead
+0012800 beef dead 0000 0000 0000 0000 0000 0000
00290e0 c0fe dead 0000 0000 0000 0000 0000 0000
002a0c0 0000 0000 0000 0000 c0fe dead 0000 0000
002b6d0 4ead dead 0000 2580 0015 0000 df48 a14b
002bb10 0000 0000 d00d dead 717c 6dcb 01cc d330
直接关注4ead dead这一行,后面的0000 2580 0015 0000即为kaslr

但是由于arm采用little-endian,因此需要倒序读取;

以此为例,此次kaslr为:0x001525800000

 

确认ramdump的加载偏移量

上面所列的DDRCS0_0.BIN、DDRCS1_0.BIN、DDRCS1_1.BIN为ramdump时内存的实际存储内容,属于原始数据,但是其加载的地址偏移位是未知的,这时就需要借助dump_info.txt的信息来确认了:

   1 0x0000000080000000 0000002147483648   DDR CS0 part0 Memo         DDRCS0_0.BIN 
   1 0x0000000100000000 0000002147483648   DDR CS1 part0 Memo         DDRCS1_0.BIN 
   1 0x0000000180000000 0000002147483648   DDR CS1 part1 Memo         DDRCS1_1.BIN 

加粗的内容就是这三块内存数据加载的偏移位;

 

至此,我们获取到了crash分析ramdump的所有必要信息,现在只需要进行拼接即可:

使用crash分析ramdump

crash vmlinux  Port_COM19/DDRCS0_0.BIN@0x80000000,Port_COM19/DDRCS1_0.BIN@0x100000000,Port_COM19/DDRCS1_1.BIN@0x180000000 --kaslr=0x001525800000

 

附录:常用指令

log - 查看dmesg

dis -xl <$fun> - 查看某个函数的汇编代码

set <$pid> - 设置需要查看的进程pid

bt -T - 查看调用栈信息

list -s list_head <$addr> - 从某个地址起,查看其往后的链表情况

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值