ubuntu 版本: Ubuntu 22.04.1 LTS 5.15.0-58.64-generic 5.15.74
crash白皮书
crash github
Ubuntu安装Kernel-debuginfo
配置安装源
1 | baoze@baoze:~/workspace$ cat <<EOF | sudo tee /etc/apt/sources.list.d/ddebs.list |
直接下载安装
到网站 http://ddebs.ubuntu.com/pool/main/l/linux/
下载对应的debug-info包,然后进行安装,vmlinux
默认安装在/usr/lib/debug/boot/vmlinux-5.15.0-58-generic
1 | baoze@baoze:~/workspace$ wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-58-generic-dbgsym_5.15.0-58.64_amd64.ddeb |
安装crash
1 | baoze@baoze:~/workspace$ sudo apt install crash |
crash常用调试命令
命令 | 说明 |
---|---|
help |
查看<某个命令>帮助信息 |
log | 查看系统的日志 |
bt | 查看堆栈信息 |
set |
切换调试进程 |
struct task_struct ffff8b7df3cdae00 -x | 把指定地址的内容以task_struct结构体解析打印,如果不带地址会显示结构体定义和大小 |
dis -r ffffffff9a6010ae | dis命令进行返汇编,查看对应地址的代码逻辑 |
ps | 查看所有进程信息 |
mod | 查看当前加载的module,通过其他参数也可以加载对应的module |
files | 查看打开的文件信息 |
p init_task | 查看init_task变量的值 |
vm | 查看虚拟内存 |
list | 查看链表信息,可以遍历数据结构中的链表数据 |
list命令使用
list [[-o] offset][-e end][-[s|S] struct[.member[,member] [-l offset]] -[x|d]] [-r|-B] [-h [-O head_offset]|-H] start
list命令解析链表的内容。内核中链表的方式通常有两种
- 包含
next
指针的单链表 - 使用
struct list_head
的双链表
-o
参数: 结构体中执行next
指针的偏移量(默认为0),通常可以采用struct.member
来表示。-o
可以省略输入-e
参数: list的结束地址,通常情况下crash根据链表的规则自动结束-s
参数: 需要输出的结构体中的成员,采用struct.member1,member2
来表示,需要输出多个成员时,用,
隔开。如果不输入该参数,则只打印地址信息。-S
参数: 类似于-s
,但不是解析gdb输出,而是直接从内存中读取成员值,因此该命令对于1-、2-、4-和8字节成员的工作速度要快得多-x
参数: 将默认输出格式改为十六进制格式-d
参数: 使用十进制格式覆盖默认输出格式-r
参数: 对于一个链接到list_head结构的列表,使用“prev”指针而不是“next”,以相反的顺序遍历列表start
参数: 第一个数据结构的地址。可以用十六进制的形式表示,也可以用表达式求值为一个地址,它取决于-h或-h选项是否在前面-h start
参数: 包含嵌入list_head的数据结构的地址。-H start
参数: list_head结构的地址,通常是外部独立的list_head()的地址。
示例一
全局变量struct file_system_type file_systems
通过next
指针来保存下一个文件系统的类型的数据
1 | struct file_system_type { |
1 | crash> p file_systems |
示例二:
全局变量super_blocks
是struct list_head
类型,链表中保存的是struct super_block
类型的数据。
1 | static LIST_HEAD(super_blocks); |
1 | crash> p super_blocks |
示例三:
struct super_block中有个成员 struct list_head s_mounts
,该成员作为链表头,通过struct mount->mnt_instance
成员挂了struct mount
结构体。
1 | list -o mount.mnt_instance -s mount.mnt_mp,mnt_mountpoint -O super_block.s_mounts -h 0xffff90ab00b06800 |