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