合集-crash工具使用方法
摘要:作者 pengdonglin137@163.com 查看percpu变量在每个cpu上的基地址 crash> kmem -o PER-CPU OFFSET VALUES: CPU 0: ffff88807f600000 CPU 1: ffff88807fa00000 CPU 2: ffff88813
阅读全文
摘要:kdump文档 https://www.kernel.org/doc/Documentation/kdump/ https://www.kernel.org/doc/html/latest/admin-guide/kdump/kdump.html Linux Kdump 机制详解 如何在Ubuntu
阅读全文
摘要:转载:https://blogs.oracle.com/linux/post/extracting-kernel-stack-function-arguments-from-linux-x86-64-kernel-crash-dumps Introduction It's common, when
阅读全文
摘要:参考: https://crash-utility.github.io/help_pages/vm.html 用法: 查看进程的用户虚拟内存信息(mm_struct地址,vma等) 查看当前进程: vm 查看指定进程: vm <进程pid> 或者 vm <进程的task_struct> 查看进程的用
阅读全文
摘要:参考: https://crash-utility.github.io/help_pages/dis.html 常用命令 反汇编指定函数 dis -x <function name>/<addr> 反汇编指定偏移 dis -x <function+0xXX> 反汇编从函数开始到指定偏移量之间的代码
阅读全文
摘要:参考: https://crash-utility.github.io/help_pages/bt.html 常用命令 查看调用栈(默认查看的导致crash的进程的调用栈) bt 查看调用栈,显示返回地址在函数内的偏移 bt -sx 查看调用栈中函数的返回地址对应的代码行 bt -l 查看详细的调用
阅读全文
摘要:参考: https://crash-utility.github.io/help_pages/list.html crash中使用list遍历结构体 说明 头节点是A_head: struct A_head { // -h: 内嵌了list_head的结构体的地址 ... // -O: list_h
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/sys.html 用法: 显示基本的系统信息,比如系统版本,cpu型号,内存容量以及panic信息等 sys 查看系统调用表 显示所有的系统调用信息: sys -c 根据系统调用号找到对应的系统调用信息: s
阅读全文
摘要:参考: https://crash-utility.github.io/help_pages/ps.html 用法 显示所有进程的pid、task_struct、cpu以及运行状态等信息 ps MEM列:使用物理内存的百分比 VSZ列:虚拟地址空间大小,单位KB RSS列:实际使用的物理内存大小,单
阅读全文
摘要:参考: linux中在进程之间传递文件描述符的实现方式 用法: 显示每个cpu的rq中的任务信息(pid,task_struct以及进程名字) runq 显示每个cpu的rq的时间戳信息 runq -t 显示每个cpu上正在运行的任务已经运行了多长时间,格式是 天-时-分-秒-毫秒 runq -m
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/tree.html 用法: 指定要搜索的树的类型,如果不指定,默认是红黑树类型 tree -t <树类型> | 树类型 | 简写 | 含义 | | : : | : : | : : | | radix | ra
阅读全文
摘要:参考: https://crash-utility.github.io/help_pages/files.html 用法: 查看进程当前打开的文件的信息,被打开的文件的file,dentry以及inode files <pid> 或者 files <进程task_struct> 根据dentry的地
阅读全文
摘要:参考: https://crash-utility.github.io/help_pages/task.html 用法: 显示指定进程的task_struct信息 task <进程pid> 或者 task <进程的task_struct地址> // 可以通过ps或者task <pid>或者进程的ta
阅读全文
摘要:参考: https://crash-utility.github.io/help_pages/kmem.html 常用方法: 查看page flags的定义 kmem -g 将指定的数字翻译为page的flags kmem -g 0x201 查看指定page的信息 kmem -p <page *>
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/p.html 用法: 查看内核中的一些全局符号的内容 p <符号名> 如果要查看的符号是一个percpu类型的,那么会显示这个percpu变量在每个cpu上的地址,如果想要查看在具体某个cpu上这个percp
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/ascii.html 用法: 将一串16进制数转换为对应的ascii码: ascii <value>
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/mount.html 用法: 查看当前被mount的文件系统信息,如mount结构体、超级块、文件系统类型、设备节点以及挂载目录 mount
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/irq.html 用法: 查看系统所有中断的使用信息,如虚拟中断号,中断的irq_desc,注册的irqaction以及名字 irq 查看实际使用的中断的信息,去除哪些没有被申请的虚拟中断号 irq -u 查
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/log.html 用法: 显示内核dmesg信息 log 显示内核demsg信息,将时间显示为人可读的形式,如:[Fri May 27 17:36:11 PDT 2022] log -T 显示的内核log中去
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/dev.html 用法: 显示设备节点对应内核地址、操作函数 dev 显示IO端口的使用信息 dev -i 显示PCI设备数据 dev -p 显示磁盘IO统计信息 dev -d
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/repeat.html 用法: 周期性执行某个命令 repeat -seconds cmd 比如: repeat -1 p jiffies : 一秒执行一次p jiffies
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/mach.html 用法: 显示机器信息,如cpu型号,内存大小,cpu个数,处理器频率,页大小,HZ以及内核地址空间布局 mach 显示cpuinfo结构内容,每个cpu都有一个,包含了cpu的硬件信息 m
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/swap.html 用法: 显示交换设备的信息 swap
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/fuser.html 用法: 查看一个文件正在被哪些进程使用,这里的文件可以是路径名,也可以是文件的inode地址 显示的信息中包含进程的pid,进程的task_struct地址,进程的名字以及使用方式 fu
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/pte.html 用法: 翻译pte页表项 如果页表映射到物理内存,那么会显示对应的物理地址以及页表项的状态 如果是交换表项,那么会显示对应的swap设备以及偏移量 pte <pte页表项的值>
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/ptob.html 用法: 将page物理页帧号转换为物理地址,即页帧号*页大小 ptob <页帧号> 将物理地址转换为页帧号,实际是地址除以页大小 btop <地址>
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/vtop.html 用法: 将内核虚拟地址转换为物理地址 vtop -k <address> 将用户虚拟地址转换为物理地址 转换过程会采用类似MMU,通过查询页表来进行转换,转换过程会显示出来 对于用户虚拟地
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/ptov.html 用法: 将物理内存地址转换为内核虚拟地址 ptov <物理地址> 将percpu偏移地址转为指定cpu上的内核虚拟地址 得到percpu地址在所有cpu上的虚拟地址:ptov <percp
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/search.html 用法: 设置搜索的起始地址,可以配合下面的-k -u -p等使用 search -s <起始地址> 搜索内核虚拟地址空间,这个也是默认的搜索选项 search -k 搜索内核虚拟地址空
阅读全文
摘要:内核版本:5.14 ubuntu版本:20.04 参考: Linux_schedule_cgroup.pdf 在开机时,会自动挂载cgroup文件系统,可以通过cat /proc/cgroups来查看当前在用的cgroup子系统。 root@ubuntu-vm:~# cat /proc/cgroup
阅读全文
摘要:场景 如果虚拟机没有开启kdump,或者卡死了,那么可以进入qemu的monitor模式将虚机的内存保存到文件中,然后使用crash工具进行分析。 示例 启动虚拟机,然后按ctrl+a c进入monitor,查看帮助 (qemu) help dump-guest-memory dump-guest-
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/mod.html 用法: 加载指定内核模块的符号 mod -s <模块名字> <模块的ko文件路径> 如果没有传递文件路径,那么会在/lib/modules/中搜索 如果想强制指定内核模块的搜索路径,并且加载
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/sym.html 用法: 查看系统中所有的全局符号及其地址 sym -l 对于percpu类型的,那么显示的时偏移量,可以使用 p <offset or sym>:0,2-3 查看系统中所有内核模块中的符号
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/waitq.html 用法: 查看等待队列中被阻塞的进程 waitq <等待队列地址> 这里的等待队列的数据类型是 wait_queue_head 等待队列地址的表达方式有三种: wait_queue_hea
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/wr.html 用法: 需要具备对/dev/mem设备节点的写权限。 写某个地址,默认数据类型为long wr <内核地址 或 符号> <数值> 如果是用户地址,那么用wr -u 如果是内核地址,可以使用wr
阅读全文
摘要:参考: https://crash-utility.github.io/help_pages/rd.html 用法: 读取内核虚地址地址或者内核符号的值,默认16进制显示,类型为unsigned long,并且会将值对应的ascii码显示出来 rd <内核地址> 或 rd <内核符号> 如果不需要将
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/whatis.html 用法: 查看内核内核符号或者数据类型的详细定义 whatis <数据类型> 或 whatis <内核符号> 查看内核数据类型内部成员的偏移 whatis -o <数据类型> 列出内核里
阅读全文
摘要:参考:https://crash-utility.github.io/help_pages/foreach.html 用法: 在所有的进程上执行命令 这里的命令支持如下: | 命令 | 可选参数 | 用途 | | : : | : : | : : | | bt | -r -t -l -e -R -f
阅读全文
摘要:使用crash工具根据地址查看结构体的内容时,有时需要输入struct或者union,多少有些繁琐,crash提供了*命令,直接跟在结构体或者联合体的名字的前面即可。 示例: 带struct crash> struct kmem_cache -x ffff893751f60800 struct km
阅读全文
摘要:在linux上一般通过dmidecode来获取DMI信息,crash也提供了获取DMI信息的命令,不过内容不会像dmidecode那么详细。 crash> sys -i DMI_BIOS_VENDOR: SeaBIOS DMI_BIOS_VERSION: rel-1.14.0-0-g155821a1
阅读全文
摘要:在编译内核时如果配置了CONFIG_IKCONFIG,那么内核配置文件会被内嵌到内核中,那么可以通过crash工具将其输出出来。 crash> sys config # # Automatically generated file; DO NOT EDIT. # Linux/x86 4.18.0 K
阅读全文
摘要:通过sys命令可以获取当前系统的系统调用的信息: crash> sys -c NUM SYSTEM CALL FILE AND LINE NUMBER 0 __x64_sys_read ../fs/read_write.c: 621 1 __x64_sys_write ../fs/read_writ
阅读全文
摘要:在linux系统上用lspci可以查看PCI设备信息,crash的dev命令也提供了这个功能。 crash> dev -p ROOT BUS BUSNAME ffff893eaeb43000 0000:00 PCI DEV DO:BU:SL.FN CLASS PCI_ID TYPE ffff88de
阅读全文
摘要:在linux中通过/proc/ioport和/proc/iomem可以获取系统的IO端口和内存的布局信息,在crash中需要使用dev命令来获取。 crash> dev -i RESOURCE RANGE NAME ffffffff822668c0 0000-ffff PCI IO ffff88de
阅读全文
摘要:crash的dev命令可以获取系统磁盘IO的统计数据。 获取所有磁盘的IO统计数据 crash> dev -d MAJOR GENDISK NAME REQUEST_QUEUE TOTAL ASYNC SYNC 8 ffff88de95d51000 sdm ffff88de94a90000 6537
阅读全文
摘要:crash提供了eval命令,实现了一些很好用的功能,下面学习一下。 格式: eval [-b][-l] (表达式) | 值 支持的运算符:+ - & | ^ * % / << >> 下面是需要注意的: 括号并不是必须的,但是如果使用了|、<<或者>>,那么需要使用括号 crash> eval (1
阅读全文
摘要:在crash中可以用whatis命令查看数据类型信息以及函数的原型。 如果想知道某个数据是什么类型那么可以用下面的方法: 查看结构体的定义 crash> whatis mm_struct struct mm_struct { struct { struct maple_tree mm_mt; uns
阅读全文
摘要:whatis 如果提前知道数据类型的定义,可以直接用struct、union等,否则可以直接用whatis。 crash> whatis -o page struct page { [0] unsigned long flags; union { struct { union { [8] struc
阅读全文
摘要:需求 有时我们有这样的需求,比如我们知道了结构体task_struct,然后我们又想知道内核中有哪些数据结构中包含了task_struct,或者包含了指向task_struct的指针。 做法 用whatis -m可以做到: crash> whatis -m task_struct SIZE TYPE
阅读全文
摘要:crash —— 如何知道哪些数据结构内嵌了指定的数据结构或者内嵌了指向指定数据结构的指针
阅读全文
摘要:查看所有的内核符号以及地址 crash> sym -l 0 (D) __per_cpu_start 0 (D) irq_stack_union 4000 (D) cpu_debug_store 5000 (D) cpu_tss_rw 8000 (D) gdt_page 9000 (d) except
阅读全文
摘要:通过sym可以将内核地址转换成内核符号,或者将内核符号转换成内核地址。 根据地址转换为符号 函数地址 crash> sym ffffffff8166f300 ffffffff8166f300 (T) blk_update_request+16 /home/pengdl/x86_64/linux-6.
阅读全文
摘要:crash> mach -m PHYSICAL ADDRESS RANGE TYPE 0000000000000000 - 0000000000001000 E820_RESERVED 0000000000001000 - 000000000006e000 E820_RAM 000000000006
阅读全文
摘要:crash> mach -c CPU 0: struct cpuinfo_x86 { x86 = 6 '\006', x86_vendor = 0 '\000', x86_model = 85 'U', x86_stepping = 7 '\a', x86_tlbsize = 0, x86_virt
阅读全文
摘要:crash> mach MACHINE TYPE: x86_64 MEMORY SIZE: 766.5 GB CPUS: 96 PROCESSOR SPEED: 2200 Mhz HZ: 250 PAGE SIZE: 4096 KERNEL VIRTUAL BASE: ffff88800000000
阅读全文
摘要:通用统计信息 crash> kmem -i PAGES TOTAL PERCENTAGE TOTAL MEM 197646761 754 GB FREE 33983015 129.6 GB 17% of TOTAL MEM USED 163663746 624.3 GB 82% of TOTAL M
阅读全文
摘要:crash> kmem -v VMAP_AREA VM_STRUCT ADDRESS RANGE SIZE ffff88debf51c900 ffff88debf53bd00 ffffc90000000000 - ffffc90000002000 8192 ffff88debf51cf60 ffff
阅读全文
摘要:crash> kmem -n NODE SIZE PGLIST_DATA BOOTMEM_DATA NODE_ZONES 0 100925439 ffff88e03ffc1000 ffff88e03ffc1000 ffff88e03ffc5000 ffff88e03ffc9000 ffff88e03
阅读全文
摘要:linux中page数据结构可以通过mem_map数组访问,下面的方法可以输出每个page的相关成员。 通用版本 下面这个命令可以显示每个page的一些关键成员的值。 crash> kmem -p PAGE PHYSICAL MAPPING INDEX CNT FLAGS ffffea0000000
阅读全文
摘要:将page的flags转换为可读字符串 crash> kmem -g 01fffe00000a001c FLAGS: 1fffe00000a001c PAGE-FLAG BIT VALUE PG_referenced 2 0000004 PG_uptodate 3 0000008 PG_dirty
阅读全文
摘要:在linux系统中可以通过/proc/slabinfo获取slab的统计数据,crash提供了kmem来实现这个功能。 查看系统每个kmem_cache的概要信息 crash> kmem -s CACHE OBJSIZE ALLOCATED TOTAL SLABS SSIZE NAME ffff88
阅读全文
摘要:crash提供了vm命令来输出进程的vma相关的信息。 输出当前当进程的vma列表 crash> vm PID: 3319 TASK: ffff889760358000 CPU: 6 COMMAND: "kvm" MM PGD RSS TOTAL_VM ffff893ada165000 ffff89
阅读全文
摘要:方法1 使用ps获取进程的task_struct地址,然后得到mm_struct地址 crash> ps | grep bash 6666 96253 8 ffff88a07fd42000 IN 0.0 24268 3048 bash 8288 59636 14 ffff88fdc4678000 I
阅读全文
摘要:以下面的task_struct为例: crash> *task_struct -ox ffff893e3846e000 struct task_struct { [ffff893e3846e000] struct thread_info thread_info; [ffff893e3846e010]
阅读全文
摘要:有时我们得到了某个结构体的地址,这个结构体内部有一个指向另外一个数据结构的指针,那么如何快速输出另外一个数据的内容。 这里有两种方法,还是以task_struct为例,我想输出mm成员的内容: 方法1 根据结构体的地址输出指针成员的值,然后再进行二次引用 crash> *task_struct.mm
阅读全文
摘要:有时我们知道了一个文件的file或者dentry地址,想知道对应的文件的路径,下面介绍两种方法: file 如果知道的是file的地址,可以使用files命令: crash> foreach files | grep ffff88824243e000 1 ffff88824243e000 ffff8
阅读全文
摘要:当我们知道某个数组的地址,可以使用下面的方法连续输出若干个数组成员的值,而不用每次手动计算下一个数组成员的地址,这里的数组地址可以是直接的内存地址,也可以是一个全局的符号名。 示例 /* page结构体在内存中是连续存放的,如果知道了一个page的地址,下面的 例子连续输出从指定的page开始的连续
阅读全文
摘要:有时我们有这样的需求,想查看某个进程的内核栈里的全部内容,介绍下面的几种做法: 方法1:得到进程的栈底地址以及栈大小,然后使用rd指令读取 使用mach指令获取内核栈的大小 crash> mach | grep SIZE MEMORY SIZE: 64 GB PAGE SIZE: 4096 KERN
阅读全文
摘要:下面是trace扩展的项目地址: https://github.com/fujitsu/crash-trace 如果已经编译安装过crash,可以直接编译,然后使用extend工具加载. 加载模块 crash> extend /mnt/crash-trace/trace.so /mnt/crash-
阅读全文
摘要:在创建进程或者线程的时候,会调用copy_process,可以看到如下逻辑: /* ok, now we should be set up.. */ p->pid = pid_nr(pid); if (clone_flags & CLONE_THREAD) { p->group_leader = c
阅读全文