只需一步,快速开始
一般系统在安装后在/boot目录下,也有个内核映像文件,vmlinuxz开头的文件,但是它是压缩过后的,无法完成调试工作,如下图:
登录/注册后可看大图 d89b2ba19dc1b468c7cdfe1a9562d889.png (35.94 KB, 下载次数: 330) 下载附件 2022-6-29 15:21 上传 所以我们需要下载带有完整调试信息的内核映像文件(编译时带-g选项),内核调试信息包kernel-debuginfo有两个:kernel-debuginfokernel-debuginfo-common 对于centos系统,可以在http://debuginfo.centos.org/上下载到各发行版本所需的调试包。 对于centos7.x,安装对应内核版本的内核调试包,执行如下即可:wget http://debuginfo.centos.org/7/x8 ... ommon-x86_64-`uname -r`.rpmwget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-`uname -r`.rpm 注意:如果系统为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 登录/注册后可看大图 a85f12bd60c2cc273eae40f9f97fb36a.png (79.67 KB, 下载次数: 337) 下载附件 2022-6-29 15:27 上传 其中下面这些信息,就是导致系统崩溃的直接原因及进程相关信息: 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 打印指定进程栈信息。 登录/注册后可看大图 61f0fa4fcce3ba5a5621b0d3cbbb2277.png (47.21 KB, 下载次数: 329) 下载附件 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, 下载次数: 328) 下载附件 2022-6-29 15:29 上传 可以分析出当时,内核启动的各项配置,内核最后崩溃时异常日志信息。 3,DIS命令 dis -l (function+offset) 10 反汇编出指令所在代码开始,10行代码 登录/注册后可看大图 ad7cfc0b353b5786179ff29b242ead8e.png (29.78 KB, 下载次数: 350) 下载附件 2022-6-29 15:30 上传 幸运的话,反汇编出来会直接对应源码,我们这里只能看出执行mov 0x70(%rdi),%r13时系统崩溃。4,MOD命令mod 查看当时内核加载的所有内核模块信息 登录/注册后可看大图 dda2c27a78b8283ed9a79b482b9c5a96.png (44.39 KB, 下载次数: 336) 下载附件 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 FILEffffffffc07c7000 my_test_lkm 12740 /mnt/hgfs/test_ko/lkm-test05/my_test_lkm.ko 5,SYM命令 sym 转换指定符号为其虚拟地址,显示系统中符号信息如上面bt打印的RIP: ffffffffc07c5024,使用sym转换查看系统符号信息crash> sym ffffffffc07c5024ffffffffc07c5024 (t) my_openat+36 [my_test_lkm] /mnt/hgfs/test_ko/lkm-test05/my_lkm.c: 25这时就可以看出对应到my_test_lkm模块的源码,/mnt/hgfs/test_ko/lkm-test05/my_lkm.c文件里第25行,查看代码可以发现: 登录/注册后可看大图 33a8ce245c1ef003337073a8af9b6933.png (44.02 KB, 下载次数: 334) 下载附件 2022-6-29 15:31 上传 原因:这种hook写法在centos8.x上的最新系统调用约定,是内核版本4.17及之后采用的调用约定。而我当前环境是centos7.6,内核版本为3.10。0,其调用约定并不是这样的,所以这样取参数是有问题的。 6,PS命令 ps 打印内核崩溃时,正常的进程信息 登录/注册后可看大图 d871a2998194a9fa71f3c7d865bb6f83.png (77.98 KB, 下载次数: 343) 下载附件 2022-6-29 15:33 上传 带 > 标识代表是活跃的进程,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 打印指定进程所打开的文件信息 登录/注册后可看大图 f9a0b57af7644ac2babc69bd5ea8b602.png (34.24 KB, 下载次数: 344) 下载附件 2022-6-29 15:33 上传 8,VM命令 vm pid 打印某指定进程当时虚拟内存基本信息 登录/注册后可看大图 2748383008fedb229ca09cd6f6f9a152.png (121.09 KB, 下载次数: 340) 下载附件 2022-6-29 15:34 上传 9,TASK命令 task 查看当前进程或指定进程task_struct和thread_info的信息 登录/注册后可看大图 d82a367e324e27fc5be67b6c7c9f1688.png (45.4 KB, 下载次数: 332) 下载附件 2022-6-29 15:35 上传 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查看: 登录/注册后可看大图 bbf83601f560c0bc5d8681fd9144265d.png (22.32 KB, 下载次数: 340) 下载附件 2022-6-29 15:36 上传 10,其他命令 可以通过help查看到如下: 登录/注册后可看大图 31ed348d5b01a2e49e9521c12c2a7054.png (22.53 KB, 下载次数: 332) 下载附件 2022-6-29 15:37 上传
d89b2ba19dc1b468c7cdfe1a9562d889.png (35.94 KB, 下载次数: 330)
下载附件
2022-6-29 15:21 上传
所以我们需要下载带有完整调试信息的内核映像文件(编译时带-g选项),内核调试信息包kernel-debuginfo有两个:
对于centos系统,可以在http://debuginfo.centos.org/上下载到各发行版本所需的调试包。 对于centos7.x,安装对应内核版本的内核调试包,执行如下即可:
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, 下载次数: 337)
2022-6-29 15:27 上传
61f0fa4fcce3ba5a5621b0d3cbbb2277.png (47.21 KB, 下载次数: 329)
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, 下载次数: 328) 下载附件 2022-6-29 15:29 上传 可以分析出当时,内核启动的各项配置,内核最后崩溃时异常日志信息。 3,DIS命令 dis -l (function+offset) 10 反汇编出指令所在代码开始,10行代码 登录/注册后可看大图 ad7cfc0b353b5786179ff29b242ead8e.png (29.78 KB, 下载次数: 350) 下载附件 2022-6-29 15:30 上传 幸运的话,反汇编出来会直接对应源码,我们这里只能看出执行mov 0x70(%rdi),%r13时系统崩溃。4,MOD命令mod 查看当时内核加载的所有内核模块信息 登录/注册后可看大图 dda2c27a78b8283ed9a79b482b9c5a96.png (44.39 KB, 下载次数: 336) 下载附件 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 FILEffffffffc07c7000 my_test_lkm 12740 /mnt/hgfs/test_ko/lkm-test05/my_test_lkm.ko 5,SYM命令 sym 转换指定符号为其虚拟地址,显示系统中符号信息如上面bt打印的RIP: ffffffffc07c5024,使用sym转换查看系统符号信息crash> sym ffffffffc07c5024ffffffffc07c5024 (t) my_openat+36 [my_test_lkm] /mnt/hgfs/test_ko/lkm-test05/my_lkm.c: 25这时就可以看出对应到my_test_lkm模块的源码,/mnt/hgfs/test_ko/lkm-test05/my_lkm.c文件里第25行,查看代码可以发现: 登录/注册后可看大图 33a8ce245c1ef003337073a8af9b6933.png (44.02 KB, 下载次数: 334) 下载附件 2022-6-29 15:31 上传 原因:这种hook写法在centos8.x上的最新系统调用约定,是内核版本4.17及之后采用的调用约定。而我当前环境是centos7.6,内核版本为3.10。0,其调用约定并不是这样的,所以这样取参数是有问题的。 6,PS命令 ps 打印内核崩溃时,正常的进程信息 登录/注册后可看大图 d871a2998194a9fa71f3c7d865bb6f83.png (77.98 KB, 下载次数: 343) 下载附件 2022-6-29 15:33 上传 带 > 标识代表是活跃的进程,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 打印指定进程所打开的文件信息 登录/注册后可看大图 f9a0b57af7644ac2babc69bd5ea8b602.png (34.24 KB, 下载次数: 344) 下载附件 2022-6-29 15:33 上传 8,VM命令 vm pid 打印某指定进程当时虚拟内存基本信息 登录/注册后可看大图 2748383008fedb229ca09cd6f6f9a152.png (121.09 KB, 下载次数: 340) 下载附件 2022-6-29 15:34 上传 9,TASK命令 task 查看当前进程或指定进程task_struct和thread_info的信息 登录/注册后可看大图 d82a367e324e27fc5be67b6c7c9f1688.png (45.4 KB, 下载次数: 332) 下载附件 2022-6-29 15:35 上传 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查看: 登录/注册后可看大图 bbf83601f560c0bc5d8681fd9144265d.png (22.32 KB, 下载次数: 340) 下载附件 2022-6-29 15:36 上传 10,其他命令 可以通过help查看到如下: 登录/注册后可看大图 31ed348d5b01a2e49e9521c12c2a7054.png (22.53 KB, 下载次数: 332) 下载附件 2022-6-29 15:37 上传
b71c70f777340513ec9894e4e8370ba1.png (80.76 KB, 下载次数: 328)
2022-6-29 15:29 上传
可以分析出当时,内核启动的各项配置,内核最后崩溃时异常日志信息。
3,DIS命令
dis -l (function+offset) 10 反汇编出指令所在代码开始,10行代码
登录/注册后可看大图 ad7cfc0b353b5786179ff29b242ead8e.png (29.78 KB, 下载次数: 350) 下载附件 2022-6-29 15:30 上传 幸运的话,反汇编出来会直接对应源码,我们这里只能看出执行mov 0x70(%rdi),%r13时系统崩溃。4,MOD命令mod 查看当时内核加载的所有内核模块信息 登录/注册后可看大图 dda2c27a78b8283ed9a79b482b9c5a96.png (44.39 KB, 下载次数: 336) 下载附件 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 FILEffffffffc07c7000 my_test_lkm 12740 /mnt/hgfs/test_ko/lkm-test05/my_test_lkm.ko 5,SYM命令 sym 转换指定符号为其虚拟地址,显示系统中符号信息如上面bt打印的RIP: ffffffffc07c5024,使用sym转换查看系统符号信息crash> sym ffffffffc07c5024ffffffffc07c5024 (t) my_openat+36 [my_test_lkm] /mnt/hgfs/test_ko/lkm-test05/my_lkm.c: 25这时就可以看出对应到my_test_lkm模块的源码,/mnt/hgfs/test_ko/lkm-test05/my_lkm.c文件里第25行,查看代码可以发现: 登录/注册后可看大图 33a8ce245c1ef003337073a8af9b6933.png (44.02 KB, 下载次数: 334) 下载附件 2022-6-29 15:31 上传 原因:这种hook写法在centos8.x上的最新系统调用约定,是内核版本4.17及之后采用的调用约定。而我当前环境是centos7.6,内核版本为3.10。0,其调用约定并不是这样的,所以这样取参数是有问题的。 6,PS命令 ps 打印内核崩溃时,正常的进程信息 登录/注册后可看大图 d871a2998194a9fa71f3c7d865bb6f83.png (77.98 KB, 下载次数: 343) 下载附件 2022-6-29 15:33 上传 带 > 标识代表是活跃的进程,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 打印指定进程所打开的文件信息 登录/注册后可看大图 f9a0b57af7644ac2babc69bd5ea8b602.png (34.24 KB, 下载次数: 344) 下载附件 2022-6-29 15:33 上传 8,VM命令 vm pid 打印某指定进程当时虚拟内存基本信息 登录/注册后可看大图 2748383008fedb229ca09cd6f6f9a152.png (121.09 KB, 下载次数: 340) 下载附件 2022-6-29 15:34 上传 9,TASK命令 task 查看当前进程或指定进程task_struct和thread_info的信息 登录/注册后可看大图 d82a367e324e27fc5be67b6c7c9f1688.png (45.4 KB, 下载次数: 332) 下载附件 2022-6-29 15:35 上传 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查看: 登录/注册后可看大图 bbf83601f560c0bc5d8681fd9144265d.png (22.32 KB, 下载次数: 340) 下载附件 2022-6-29 15:36 上传 10,其他命令 可以通过help查看到如下: 登录/注册后可看大图 31ed348d5b01a2e49e9521c12c2a7054.png (22.53 KB, 下载次数: 332) 下载附件 2022-6-29 15:37 上传
ad7cfc0b353b5786179ff29b242ead8e.png (29.78 KB, 下载次数: 350)
2022-6-29 15:30 上传
幸运的话,反汇编出来会直接对应源码,我们这里只能看出执行mov 0x70(%rdi),%r13时系统崩溃。
4,MOD命令
mod 查看当时内核加载的所有内核模块信息
登录/注册后可看大图 dda2c27a78b8283ed9a79b482b9c5a96.png (44.39 KB, 下载次数: 336) 下载附件 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 FILEffffffffc07c7000 my_test_lkm 12740 /mnt/hgfs/test_ko/lkm-test05/my_test_lkm.ko 5,SYM命令 sym 转换指定符号为其虚拟地址,显示系统中符号信息如上面bt打印的RIP: ffffffffc07c5024,使用sym转换查看系统符号信息crash> sym ffffffffc07c5024ffffffffc07c5024 (t) my_openat+36 [my_test_lkm] /mnt/hgfs/test_ko/lkm-test05/my_lkm.c: 25这时就可以看出对应到my_test_lkm模块的源码,/mnt/hgfs/test_ko/lkm-test05/my_lkm.c文件里第25行,查看代码可以发现: 登录/注册后可看大图 33a8ce245c1ef003337073a8af9b6933.png (44.02 KB, 下载次数: 334) 下载附件 2022-6-29 15:31 上传 原因:这种hook写法在centos8.x上的最新系统调用约定,是内核版本4.17及之后采用的调用约定。而我当前环境是centos7.6,内核版本为3.10。0,其调用约定并不是这样的,所以这样取参数是有问题的。 6,PS命令 ps 打印内核崩溃时,正常的进程信息 登录/注册后可看大图 d871a2998194a9fa71f3c7d865bb6f83.png (77.98 KB, 下载次数: 343) 下载附件 2022-6-29 15:33 上传 带 > 标识代表是活跃的进程,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 打印指定进程所打开的文件信息 登录/注册后可看大图 f9a0b57af7644ac2babc69bd5ea8b602.png (34.24 KB, 下载次数: 344) 下载附件 2022-6-29 15:33 上传 8,VM命令 vm pid 打印某指定进程当时虚拟内存基本信息 登录/注册后可看大图 2748383008fedb229ca09cd6f6f9a152.png (121.09 KB, 下载次数: 340) 下载附件 2022-6-29 15:34 上传 9,TASK命令 task 查看当前进程或指定进程task_struct和thread_info的信息 登录/注册后可看大图 d82a367e324e27fc5be67b6c7c9f1688.png (45.4 KB, 下载次数: 332) 下载附件 2022-6-29 15:35 上传 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查看: 登录/注册后可看大图 bbf83601f560c0bc5d8681fd9144265d.png (22.32 KB, 下载次数: 340) 下载附件 2022-6-29 15:36 上传 10,其他命令 可以通过help查看到如下: 登录/注册后可看大图 31ed348d5b01a2e49e9521c12c2a7054.png (22.53 KB, 下载次数: 332) 下载附件 2022-6-29 15:37 上传
dda2c27a78b8283ed9a79b482b9c5a96.png (44.39 KB, 下载次数: 336)
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, 下载次数: 334)
d871a2998194a9fa71f3c7d865bb6f83.png (77.98 KB, 下载次数: 343)
2022-6-29 15:33 上传
f9a0b57af7644ac2babc69bd5ea8b602.png (34.24 KB, 下载次数: 344)
2748383008fedb229ca09cd6f6f9a152.png (121.09 KB, 下载次数: 340)
2022-6-29 15:34 上传
d82a367e324e27fc5be67b6c7c9f1688.png (45.4 KB, 下载次数: 332)
2022-6-29 15:35 上传
bbf83601f560c0bc5d8681fd9144265d.png (22.32 KB, 下载次数: 340)
2022-6-29 15:36 上传
31ed348d5b01a2e49e9521c12c2a7054.png (22.53 KB, 下载次数: 332)
2022-6-29 15:37 上传
使用道具 举报
本版积分规则 发表回复
|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )
GMT+8, 2024-11-29 00:07 , Processed in 0.103850 second(s), 24 queries .
重庆思庄学习中心论坛-重庆思庄科技有限公司论坛
© 2001-2020