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 |