1. Crash命令介绍

虽然使用硬件设备来调试有很多优点和方便之处,但是我一直希望代码是可以自己调试自己的,从而避免使用一些昂贵的外部的的设备。

crash version: 8.0.2 gdb version: 10.2共51个命令。

 1*              files          mod            sbitmapq       union
 2alias          foreach        mount          search         vm
 3ascii          fuser          net            set            vtop
 4bpf            gdb            p              sig            waitq
 5bt             help           ps             struct         whatis
 6btop           ipcs           pte            swap           wr
 7dev            irq            ptob           sym            q
 8dis            kmem           ptov           sys
 9eval           list           rd             task
10exit           log            repeat         timer
11extend         mach           runq           tree

1.1. Symbolic display of kernel text or data【7】

这些命令利用gdb的能力来显示内核数据结构。

index Command Description
1 struct 查看结构体信息
2 union 类似struct,查看union信息
3 * 代替struct或者union
4 p 显示变量/符号等的内容
5 whatis 查找符号/数据结构信息
6 sym 查看内核及模块的符号的虚拟地址
7 dis 查看反汇编信息

1.2. System state【25】

系统范围或按任务为单位的各种内核子系统相关命令。

index Command Description
1 bt 分析调用栈
2 dev 查看设备节点信息
3 files 查看进程打开的文件
4 fuser 查看文件或socket正在被哪些进程使用
5 irq 查看irq相关信息
6 kmem 查看内核内存信息
7 log 查看内核日志信息
8 mach machine相关数据
9 mod 查看模块信息、符号和调试数据
10 mount 查看被挂载的文件系统信息
11 net 显示网络信息
12 ps 查看系统中的进程状态
13 pte 查看页表项
14 runq 查看cpu运行队列
15 sig 查看任务的所有信号信息
16 swap 查看swap设备信息
17 sys 查看系统信息
18 task 查看任务的task_struct和thread_info信息
19 timer 查看定时器队列数据
20 vm 查看上下文的虚拟内存信息,比如task_struct、mm_struct
21 vtop 将内核或者用户虚拟地址转为物理地址,映射不存在时转为swap或文件信息
22 waitq 查看在等待队列中睡眠的进程
23 tree 遍历radix tree、XArray或red-black tree的内容
24 ipcs 查看进程间通信信息
25 sbitmapq 查看sbitmap_queue数据结构的信息

1.3. Utility functions【9】

不同用途的辅助命令。

index Command Description
1 ascii 十六进制转字符串
2 btop bytes to page,十六进制地址转页帧号
3 eval 计算表达式
4 list 遍历列表
5 ptob page to bytes,页帧号转字节数据
6 ptov 将物理地址或者percpu地址转换为内核虚拟地址
7 search 在内存里搜索指定的内容
8 rd 读取指定地址的内容
9 wr 向指定地址写入数据

1.4. Session Control Commands【10】

crash会话控制命令

index Command Description
1 alias 查看别名列表或为命令设置别名
2 bpf 显示eBPF程序信息
3 exit 退出crash
4 extend 加载或卸载crash插件
5 foreach 遍历指定的进程并执行命令
6 gdb 将参数传递到gdb
7 help 帮助信息
8 q exit的别名
9 repeat 周期执行某个命令
10 set 设置进程上下文或crash内部变量

使用举例

bt

 1bt
 2bt [pid]    # 查看指定进程的栈,可以指定多个
 3bt [task_struct addr]   # 查看指定进程的栈,可以指定多个,也可于pid一起使用
 4bt -l       # 查看符号对应的文件行号
 5bt -s       # 查看符号和指令偏移(默认进制显示)
 6bt -sx      # 查看符号和指令偏移(x表示十六进制)
 7bt -sd      # 查看符号和指令偏移(d表示十进制)
 8bt -a       # 查看所有CPU的栈
 9bt -c 0,1,4-7   # 查看CPU0和1上的栈
10bt -g       # 查看线程组中所有线程的调用栈
11bt -f       # 查看栈帧的所有数据
12bt -F       # 查看栈帧的所有数据,如果可以,将数据显示为符号
13bt -FF      # 查看栈帧的所有数据,如果可以,同时显示数据对应的符号

dis

1dis [sym]           # 反汇编指定函数
2dis [addr]
3dis [sym+offset]    # 反汇编指定偏移
4dis -r [sym+offset] # 反汇编从函数开始到指定偏移量之间的代码
5dis -d [sym]        # 十进制显示
6dis -x [sym]        # 十六进制显示
7dis -s [sym]        # 显示源码
8dis -l [sym]        # 显示文件行号
9dis -u              # 用户空间地址

p

1p -x [sym]        # 十六进制显示
2px   [sym]
3p -d [sym]        # 十进制显示
4pd   [sym]
5p -u [sym]        # 用户空间地址
6p irq_stat:       # 显示当前CPU上的perCPU变量
7p irq_stat:a      # 显示所有CPU上的perCPU变量
8p irq_stat:1,3,5-7,10     # 显示指定CPU上的perCPU变量

log

1显示内核dmesg信息
2log
3
4显示内核demsg信息,将时间显示为人可读的形式,如:[Fri May 27 17:36:11 PDT 2022]
5log -T
6
7显示的内核log中去除左边的时间戳信息
8log -t
9log | grep xxx

irq

 1查看系统所有中断的使用信息,如虚拟中断号,中断的irq_desc,注册的irqaction以及名字
 2irq
 3
 4查看实际使用的中断的信息,去除哪些没有被申请的虚拟中断号
 5irq -u
 6
 7查看中断向量表,适用于intel处理器
 8irq -d
 9
10查看注册的软中断
11irq -b
12
13查看中断的cpu亲和性值
14irq -a
15
16查看系统中断的使用和统计信息,类似cat /proc/interrupts
17irq -s
18
19如果想查看指定cpu上统计信息:irq -s -c a 或 irq -s -c 1,3,6-9

2. 相关链接

  1. https://crash-utility.github.io/crash_whitepaper.html
  2. https://blog.csdn.net/u014001096/article/details/134492262
  3. https://blog.csdn.net/u014001096/article/details/134492286