linux内核学习---Linux内核程序调试工具Crash的安装
客户机操作系统已禁用 CPU,请关闭或重置虚拟机
本人在研究SDN中,需要经常修改OVS源码实现自己的功能,因此大部分工作需要修改openvswitch.ko内核模块,而内核程序的修改往往更加严格,比如:如果粗心导致使用没有被赋值的指针,就会出现如下图的问题(在VMware虚拟机中会提示,在物理主机中会直接死机)
因此,本文将简单介绍一下如何调试内核程序,使用Crash工具!(时隔几个月,可能有点记不清了....)
参考文章
Ubuntu 20.04 Kdump + Crash 初体验
dump分析工具_ubantu18.04内核奔溃调试工具Crash的搭建
ubuntu 16.04 安装配置kdump
一: 程序调试工具介绍
在linux中的程序主要分为用户空间程序和内核空间程序两种,他们使用不同的工具生成的不同的dump文件,并用不同软件分析dump文件。
对于用户空间下的程序,所产生的dump文件,如:core.3296 和core-hellotest.2816.xm.1593867625 ,用gdb工具分析即可。
对于内核空间下的程序,所产生的dump文件,如/var/crash/202007092214/dump.202007092214,常用crash分析。
本文将介绍如何安装crash工具和对crash工具的简单使用!!
(一)Kdump工作原理介绍
coredump为用户态进程段错误等触发的crash现场转储机制, 可利用gdb进行corefile的调试.而Kdump为kernel crash/panic等而触发的转储机制, 一般使用crash工具进行调试.
内核崩溃转储指的是在内核异常情况时,将 RAM 中部分内容进行转储到磁盘或者其他存储中。当内核发生 panic 时,内核依靠 kexec 机制在预先保留的内存区域快速重启一个新的内核实例,预留内存区域大小可通过内核启动参数 crashkernel
指定。
为了实现 “双内核” 布局,Kdump 在内核崩溃后立即使用 kexec 引导到转储捕获内核(capture kernel),使用 kexec 引导 “覆盖” 当前运行的内核。转储捕获内核可以是专门构建的单独 Linux 内核映像,也可以在支持可重定位内核的系统架构上重用主内核映像。
kexec(kernel execution,类似于 Unix 或 Linux 的系统调用 exec)是 Linux 内核的一种机制,其允许从当前运行的内核启动新内核。kexec 会跳过由系统固件(BIOS或UEFI)执行的引导加载程序阶段和硬件初始化阶段,直接将新内核加载到主内存并立即开始执行。这避免了完全重新启动的漫长时间,并且可以通过最小化停机时间来满足系统高可用性要求。
简而言之,Kdump原理就是通过预留部分内存(如192MB) 供转储内核使用, 当panic/crash产生时 利用kexec系统调用直接拉起转储内核. 利用该内核进行crash现场的储存dump.
(二)Kdump安装
本文使用的Ubuntu16系统,如下图所示:
虽然在Ubuntu18中自带Kdump,但是Ubuntu16中却没有,通过kdump-config show命令发现需要进行安装
因此,使用sudo apt install kdump-tools进行安装即可,最后进行重启操作.
再次使用kdump-config show命令,显示如下,正常工作.
(三)Crash安装
通过以下命令进行安装,完成之后进行重启即可
sudo apt install linux-crashdump
sudo apt install crash
通过相关文件查看,可得知安装过程中,内核启动参数中的 crashkernel
已经进行了设置。
sudo cat /etc/default/grub.d/kdump-tools.cfg
sudo cat /boot/grub/grub.cfg
其实吧,我感觉在前面安装Kdump后就已经安装了前面的crash工具......,为了保险起见,这里再重启一次吧(在后面配置完crashkernel大小再进行重启吧).
在服务重启成功后,我们可在内核 dmesg
中查看到相关信息,本机保留了128M RAM 内存区供转储捕获内核使用。
dmesg -T | grep -i crash
同时我们通过命令 kdump-config show
查看到 Kdump
的状态已经 Ready
service kdump-tools status
显示 kdump-tools
状态为 Active
。
查看启动命令行 sudo cat /proc/cmdline
查看 crashkernel 内存分配的地址空间(root状态下),cat /proc/iomem | grep -i crash
查看 crashkernel 内存分配的大小cat /proc/iomem | grep -i crash
至此,kdump 服务已生效,在系统遇到崩溃的情况即可生成对应的转储文件,保存目录为 /var/crash
。
Crash
工具为 Red Hat 公司开发用于分析转储文件的工具,等同于对于内核快照进行类似于 gdb
调试的体验。
补充:128M的空间不足以支持系统崩溃时进行生成对应的转储文件,因此需要进行调整crashkernel内存大小(重点)
1.修改 /etc/defatul/grub.d/kdump-tools.cfg 中 crashkernel=512M-:768M
2.使用sudo grub-mkconfig -o /boot/grub/grub.cfg更新配置
3.reboot进行重启操作
(四)测试验证
Linux sysrq
工具可手工触发内核 panic,我们可用于临时测试:
sudo echo 1 > /proc/sys/kernel/sysrq sudo echo c > /proc/sysrq-trigger
注意:运行后会死机,重启,重启后,/var/crash会保存此次手动触发生成的vmcore
此外以上命令需要进入root用户下使用,如果使用su -无法进入,出现su: Authentication failure问题.一般是没有为root用户设置密码,设置一下即可!
sudo passwd root
命令运行成功后,/var/carsh
目录中会生成了一个以当前日期命名的目录,包含 dmesg.x
和 dump.x
两个文件,其中 demsg.x
为崩溃时候的系统内核日志,dump.x
文件则为转储的内核快照文件。
二:安装带有调试信息的 vmlinux
文件
为了使用 Crash
工具,我们还需要安装带有调试信息的 vmlinux
文件.
(一)vmlinux介绍
找到vmlinuz对应的vmlinux文件,vmlinux文件是crash工具的必要输入参数。
vmlinux 是ELF文件,即linux kernel编译出来的最原始的文件。
vmlinuz是由ELF文件vmlinux经过OBJCOPY后,并经过压缩后的文件。
(二)vmlinux安装
通过以下方法找到kernel对应的vmlinux.
1.设置repo仓库
echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ddebs.list
sudo apt-get update
2.安装dbgsym
sudo apt -y install linux-image-$(uname -r)-dbgsym --allow-unauthenticated
输入命令后,会自动查找对应内核版本下的dbgsym文件,如下图:
linux-image-unsigned-4.15.0-142-generic-dbgsym
当然同样最好把以下版本一起安装
linux-image-4.15.0-142-generic-dbgsym
若是使用apt安装太慢,通过网站搜索进行安装也可(第一次是用的网站https://launchpad.net/ubuntu/xenial/amd64/linux-image-unsigned-4.15.0-142-generic-dbgsym/4.15.0-142.146~16.04.1,这次使用的命令)
安装完成后:
在 ubuntu-dbgsym-keyring
包安装成功后,我们可以看到在目录 /usr/lib/debug/boot/
中已经安装了 vmlinux-5.4.0-80-generic
文件。
Crash
工具进行调试: sudo crash /usr/lib/debug/boot/vmlinux-4.15.0-142-generic /var/crash/202205171635/dump.202205171635
使用 bt 命令查看崩溃时候的运行栈
补充:当我们安装了不同版本的dbgsym调试文件,会导致无法进入crash工具,好像会提示问题.因此我们需要按照前面的方法进入网站找到合适的文件,通过dpkg -i命令进行安装即可.
至此crash工具安装完成,以后编写内核程序出错,死机时系统会保存内核状态,并进行自动重启,我们通过使用crash工具,通过简单的命令,如bt查看运行栈,可以大致了解出问题的函数位置和原因,包括使用空指针等等
三:Crash 子命令使用
子命令的运行与 bash
运行类似,可以使用文件重定向、grep/awk 等命令,分析起来非常方便。
具体使用格式,可通过 man subcommand
来了解子命令的详细用法。
(一)bt:用于查看进程的栈和寄存器状态
我就常用这个,得知在那个函数,出现什么错误,然后修改即可
(二)ps命令查看系统中的全部进程
ps
命令查看系统中的全部进程,其中 ST 字段表示状态, RU = “Running”, IN = “Interruptable” UN = “UnInterruptable”, ID = “Idle” 。TASK
字段表示 task_struct
的地址。
(三)files:files pid
查看指定进程打开文件详情
(四)task 用于显示 task_struct 结构体
如果只想查看个别子字段,可以使用 -R
来指定,支持逗号分割多个子字段:
(五)struct struct 命令可以查看对应结构的详细字段,如果需要查看字段的偏移量添加 -o 参数即可
如果明确知道某个地址对应的数据结构,也可通过 struct
来打印:(ffff9e7e90b31700对应前面1781进程地址)
(六)vm 查看指定进程的虚拟内存
(七)irq 命令查看中断
(八)kmem 用于查看系统内存信息
作者:山上有风景
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2021-05-17 FFmpeg编程(四)SDL与FFmpeg的联合使用
2020-05-17 机器学习基础---支持向量机SVM
2018-05-17 python---基础知识回顾(十一)图像处理模块PIL