前言
关于在开发板上搭建kdump+kexec环境,在内核dump时获取vmcore文件传回Ubuntu进行debug的实践
一、环境搭建
下载两个工具:crash 和 kexec-tools
crash:
https://github.com/crash-utility/crash/archive/refs/tags/7.2.8.tar.gz
编译:make target=arm64,在ubuntu上跑
kexec-tools:
http://kernel.org/pub/linux/utils/kernel/kexec/kexec-tools.tar.gz
交叉编译:./configure ARCH=arm64 LDFLAGS=-static --host=aarch64-xx-linux --prefix=$PWD/output CC="xxx/aarch64-xxx-linux-gcc --sysroot=xxxx/aarch64-xxxx-linux"
必须要CC参数,编译完后放到开发板上运行
uboot需要传入参数 crashkernel=xxM
二、使用步骤
1.运行kexec
kexec -p /init_Image --append="console=xxxx maxcpus=1 reset_devices"
注意-p和--append参数
maxcpus=1
reset_devices
2.测试kdump环境
命令如下:
echo 1 > /proc/sys/kernel/sysrq;echo c > /proc/sysrq-trigger
实际调试时运行实际程序,如果实际调试时不触发panic,则需要确认以下参数:
sysctl -a | grep panic
sysctl -w kernel.panic=1
sysctl -w kernel.panic_on_oops=1
--------------------------------------------
kernel.hung_task_panic = 0
kernel.max_rcu_stall_to_panic = 0
kernel.panic = 1
kernel.panic_on_oops = 1
kernel.panic_on_rcu_stall = 0
kernel.panic_on_warn = 0
kernel.panic_print = 0
kernel.softlockup_panic = 1
如果没有softlockup_panic
等参数,需要配置内核,kernel trackxx
目录下
重启后vmcore文件在 /proc
目录下
3.调试
crash命令
crash vmlinux vmcore
4.crash常用命令
1. bt: 输出内核栈backtrace
-t:显示符号信息
-f:显示栈的所有数据
-l:显示文件名和行号
pid:可以显示指定pid进程的backtrace
2. dis:显示反汇编
-l:显示返汇编以及源代码
-s: 显示该函数的文件名和源代码
3. rd:读内存:
-p:读物理地址
-u:读用户虚拟地址
-d:显示十进制
-s:显示符号
-32:显示32位宽的值
-64:显示64位宽的值
-a:显示ascii码
4. struct:显示数据结构的定义以及实际的值
struct_name:显示内核中定义的数据结构
.member:显示i数据结构体中的某个成员
struct_name address:显示该数据结构在该地址的值
-o:显示每个成员在数据结构中的偏移,10进制
5. list:遍历链表,并可以打印链表中的成员的值
-h:指定链表头list_head的地址
-s:用来打印链表成员的值