所有信息仅对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值是当前执行

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

被折叠的 条评论
为什么被折叠?



