crash工具debug内核dump文件

本文介绍了如何使用crash工具在ARM芯片上分析32位和64位内核dump文件,强调了vmlinux和sysdump.core的一致性。通过全局变量和特定命令,如`sprd_debug_last_access_regs`来检查寄存器访问,以及使用`bt -r`查看特定线程的内核栈。同时,讨论了内核栈的特性,包括栈大小、线程信息和中断对栈的影响,以及如何识别和追踪内核调用链。

所有信息仅对ARM芯片有效。

32位:

crash -m phys_base=0x80000000 vmlinux sysdump.core

0x80000000是指ddr起始地物理地址 vmlinux是带符号信息的vmlinux文件 sysdump.core是dump机制拉出来的内核mem映像 。

64位:

crash -m phy_offset=0x80000000 vmlinux sysdump.core

注意vmlinux和sysdump.core必须一致,否则一般是无法解析出来的。

解析出来后就进去crash>这样子的交互界面。

通常我们会在代码里用一些全局的变量记录一些重要信息(中断,寄存器访问,bus-monitor等等)如spreadtrum的一个记录寄存器访问的全局变量是是sprd_debug_last_access_regs

crash>sprd_debug_last_access_regs

会显示这个全局变量的地址 比如0x80000ff0

crash>struct sprd_debug_last_access_regs 0x80000ff0

就会详细的打印出这个地址对应的结构体的内容

从而查看是否是寄存器访问不成功导致系统挂死。

要看一个线程的内核栈,知道其线程号时,比如214

执行以下命令:bt -r 214

就会打印出其内核栈,需要注意的是高版本的内核栈一般是8k,且头部有thread_info信息,不要将thread_info部分的内容当成是内核的栈调用信息,从而错误判断内核函数调用链,debug问题方向发生偏差。

需要注意的是内核栈往往很难追查,一般需要对照会变代码去重现调用链。

但是往往内核的汇编代码函数的第一个条指令都是把lr和pc和其他需要入栈的寄存器入栈:

kernel_function:

push {r1-r7,lr,pc}

类似这样子,而我们知道arm的pc值是当前执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值