一般系统在安装后在/boot目录下,也有个内核映像文件,vmlinuxz开头的文件,但是它是压缩过后的,无法完成调试工作,如下图:
d89b2ba19dc1b468c7cdfe1a9562d889.png (35.94 KB, 下载次数: 326) 2022-6-29 15:21 上传 所以我们需要下载带有完整调试信息的内核映像文件(编译时带-g选项),内核调试信息包kernel-debuginfo有两个: 对于centos系统,可以在http://debuginfo.centos.org/上下载到各发行版本所需的调试包。 wget http://debuginfo.centos.org/7/x8 ... ommon-x86_64-`uname -r`.rpm wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-`uname -r`.rpm a85f12bd60c2cc273eae40f9f97fb36a.png (79.67 KB, 下载次数: 333) 2022-6-29 15:27 上传 61f0fa4fcce3ba5a5621b0d3cbbb2277.png (47.21 KB, 下载次数: 326) 2022-6-29 15:28 上传 最重要的信息:[exception RIP: my_openat+36],指出发生异常的指令信息 RIP: ffffffffc07c5024,可以得知,发生crash的函数是my_openat中,偏移36字节处的指令。 这里,对应x86-64汇编,应用层下来的系统调用对应的6个参数存放的寄存器依次对应:rdi、rsi、rdx、rcx、r8、r9。对于多于6个参数的,仍存储在栈上。 2,LOG命令 打印vmcore所在的系统内核日志信息
b71c70f777340513ec9894e4e8370ba1.png (80.76 KB, 下载次数: 324) 2022-6-29 15:29 上传 可以分析出当时,内核启动的各项配置,内核最后崩溃时异常日志信息。 3,DIS命令 dis -l (function+offset) 10 反汇编出指令所在代码开始,10行代码
ad7cfc0b353b5786179ff29b242ead8e.png (29.78 KB, 下载次数: 345) 2022-6-29 15:30 上传 幸运的话,反汇编出来会直接对应源码,我们这里只能看出执行mov 0x70(%rdi),%r13时系统崩溃。 4,MOD命令 mod 查看当时内核加载的所有内核模块信息
dda2c27a78b8283ed9a79b482b9c5a96.png (44.39 KB, 下载次数: 333) 2022-6-29 15:31 上传 重装加载进改内核模块: crash> mod -s my_test_lkm /mnt/hgfs/test_ko/lkm-test05/my_test_lkm.ko MODULE NAME SIZE OBJECT FILE ffffffffc07c7000 my_test_lkm 12740 /mnt/hgfs/test_ko/lkm-test05/my_test_lkm.ko sym 转换指定符号为其虚拟地址,显示系统中符号信息 如上面bt打印的RIP: ffffffffc07c5024,使用sym转换查看系统符号信息 crash> sym ffffffffc07c5024 ffffffffc07c5024 (t) my_openat+36 [my_test_lkm] /mnt/hgfs/test_ko/lkm-test05/my_lkm.c: 25 33a8ce245c1ef003337073a8af9b6933.png (44.02 KB, 下载次数: 331) 2022-6-29 15:31 上传 d871a2998194a9fa71f3c7d865bb6f83.png (77.98 KB, 下载次数: 341) 2022-6-29 15:33 上传 f9a0b57af7644ac2babc69bd5ea8b602.png (34.24 KB, 下载次数: 339) 2022-6-29 15:33 上传 2748383008fedb229ca09cd6f6f9a152.png (121.09 KB, 下载次数: 336) 2022-6-29 15:34 上传 d82a367e324e27fc5be67b6c7c9f1688.png (45.4 KB, 下载次数: 328) 2022-6-29 15:35 上传 bbf83601f560c0bc5d8681fd9144265d.png (22.32 KB, 下载次数: 337) 2022-6-29 15:36 上传 31ed348d5b01a2e49e9521c12c2a7054.png (22.53 KB, 下载次数: 329) 2022-6-29 15:37 上传
对于centos7.x,安装对应内核版本的内核调试包,执行如下即可:
注意:如果系统为centos6.x,则将debuginfo.centos.org/后面的7改成6即可。
下载完后,安装内核调试包:
rpm -ivh *.rpm
安装完成后,可以在/lib/debug/lib/modules/3.10.0-957.el7.x86_64/目录下看到vmlinux内核映像文件:
[root@yglocal ~]# ll -th /lib/debug/lib/modules/3.10.0-957.el7.x86_64/
total 419M
drwxr-xr-x. 2 root root 119 Mar 26 13:13 vdso
drwxr-xr-x. 12 root root 128 Mar 26 13:13 kernel
-rwxr-xr-x. 2 root root 419M Nov 9 2018 vmlinux
再来安装crash工具,先查看下是否已安装
[root@yglocal ~]# rpm -q crash
crash-7.2.3-8.el7.x86_64
若没有安装过,则执行以下命令安装:
yum install crash
二,使用crash分析vmcore
分析vmcore文件,执行命令:
crash /lib/debug/lib/modules/3.10.0-957.el7.x86_64/vmlinux /var/crash/127.0.0.1-2020-04-04-14\:10\:45/vmcore
其中下面这些信息,就是导致系统崩溃的直接原因及进程相关信息:
PANIC: "BUG: unable to handle kernel NULL pointer dereference at 000000000000000c"
PID: 27005
COMMAND: "pickup"
TASK: ffff997b388ae180 [THREAD_INFO: ffff997b37f64000]
CPU: 1
STATE: TASK_RUNNING (PANIC)
1,BT命令
backtrace打印内核栈回溯信息,bt pid 打印指定进程栈信息。
5,SYM命令
原因:这种hook写法在centos8.x上的最新系统调用约定,是内核版本4.17及之后采用的调用约定。而我当前环境是centos7.6,内核版本为3.10。0,其调用约定并不是这样的,所以这样取参数是有问题的。
6,PS命令
ps 打印内核崩溃时,正常的进程信息
带 > 标识代表是活跃的进程,ps pid打印某指定进程的状态信息:
crash> ps 27005
PID PPID CPU TASK ST %MEM VSZ RSS COMM
> 27005 7783 1 ffff997b388ae180 RU 0.2 91732 4124 pickup
7,FILE命令
files pid 打印指定进程所打开的文件信息
8,VM命令
vm pid 打印某指定进程当时虚拟内存基本信息
9,TASK命令
task 查看当前进程或指定进程task_struct和thread_info的信息
10,KMEM命令
kmen 查看当时系统内存使用信息
kmem [-f|-F|-c|-C|-i|-v|-V|-n|-z|-o|-h] [-p | -m member[,member]]
[[-s|-S] [slab] [-I slab[,slab]]] [-g [flags]] [[-P] address]]
我们是要kmem -i查看:
10,其他命令
可以通过help查看到如下:
欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/)
Powered by Discuz! X3.2