Linux内核程序调试工具Crash的安装

news2025/1/13 15:58:12

转载自 山上有风景 https://www.cnblogs.com/ssyfj/p/16278883.html#ubuntu-20.04-kdump-±crash-%E5%88%9D%E4%BD%93%E9%AA%8C

一: 程序调试工具介绍

在linux中的程序主要分为用户空间程序和内核空间程序两种,他们使用不同的工具生成的不同的dump文件,并用不同软件分析dump文件。

对于用户空间下的程序,所产生的dump文件,如:core.3296 和core-hellotest.2816.xm.1593867625 ,用gdb工具分析即可。

对于内核空间下的程序,所产生的dump文件,如/var/crash/202007092214/dump.202007092214,常用crash分析。

本文将介绍如何安装crash工具和对crash工具的简单使用!!

Linux内核源码分析教程:https://mp.weixin.qq.com/s?__biz=Mzk0MzE5MTkzOA==&mid=2247488308&idx=1&sn=ed084f20c52a0a9f33c16aae07535190&chksm=c336f1d9f44178cffa89217e57d977c3e404b2001434d83af866ef4b6dca64c2f589818c2363&token=2002831924&lang=zh_CN#rd

(一)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.xdump.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 用于查看系统内存信息

在这里插入图片描述

整理了一些学习书籍、视频资料(Linux 内核、Linux C++ 后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全学习资料、教学视频和学习路线图),有需要的可以自行添加学习交流群:739729163 领取哦!!!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1166868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenApi Generator】入门和调试

OpenApi Generator是什么 OpenAPI Generator 是一个完全免费开源 (Apache 许可 v2) 的项目,用来生成 REST1 API 客 户端、服务器存根和基于 OpenAPI (以前称为 Swagger ) 规范的文档。如果您不熟悉 OpenAPI 规范,那么它就是描述 RESTful API 方面最流…

如何解决Python性能慢的问题?

目录 一、代码优化 1.1 循环优化 1.2 使用局部变量 二、并行计算 2.1 多线程/多进程 2.2 异步编程 三、使用高效库 3.1 NumPy 3.2 Cython 四、进一步的优化策略 4.1 使用JIT编译器 4.2 使用C扩展 4.3 数据结构优化 总结 Python是一种动态、解释型语言&#xff0c…

aardio - 小游戏制作库来了

将 animation 库下载后,解压到 lib\godking\ 目录即可。 附带小游戏代码及素材。 import win.ui; /*DSG{{*/ var winform win.form(text"aardio form";right759;bottom469) winform.add( custom{cls"custom";text"自定义控件";lef…

使用QEMU模拟启动uboot

uboot的相关知识,可以参考:uboot基本概念。 一、环境配置 WSL: ubutu20.04 模拟开发板:vexpress-a9 uboot版本:u-boot-2023.10 二、安装QEMU 2.1、安装sudo apt install qemu2.2、查看支持哪些开发板qemu-system-arm -M help结…

GET与POST的区别:为什么GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留?

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、G…

传感器类总结(一)MPU9250 2电路设计

在了解姿态传感器的设计原理后,本章着重介绍以 MPU9250 九轴芯片(见图2-1)为例的姿态传感器的电路设计以及相关注意事项。 引脚功能 1 RESV 接VDDIO 2-6 脚 NC 7 AUX_CL 给IIC从机设备提供时钟,如果使用外部IIC设备比如气压计&am…

分享一下积分商城怎么做

积分商城:打造独特会员体验,提升用户忠诚度 在当今竞争激烈的市场环境中,企业需要不断寻找新的策略来吸引并保留客户。积分商城就是这样一种独特的解决方案,它通过赋予会员积分,让他们能够兑换心仪的商品或服务&#…

Random指定随机种子遇到的坑

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言指定随机种子出现的问题?总结 前言 业务中,之前有一个抽奖的需求,之初想让固定的奖品和玩家绑定一个固定的池子&#xff0c…

Spring Security使用总结二,本来就是想用个数据库,没想到还是沾到Spring Security

上一章介绍了最简单的一个Security的使用。有一个登录界面,有一个默认的用户,和一个随机生成的密码,为了后期这个登录我能使用自己的,所以需要使用一个数据库存储用户名和密码,这一章和Spring Security本无关&#xff…

如何做好网页配色,分享一些配色方案和方法

很多网页设计师在选择网页配色方案时,会纠结于用什么网页UI配色方案来吸引客户的注意力,传达信息。选择正确的颜色是网页设计不可或缺的一部分。本指南将从色彩理论和色彩心理学入手,分享三个网页UI配色的简单步骤。 网页UI配色方法有很多&a…

零代码编程:用ChatGPT批量重命名多个子文件夹里面的文件标题名

一个文件夹:D:\英语学习图书配套资源\亲子英语游戏书,这本最好玩,里面有多个子文件夹: 子文件夹里面的文件要重命名,将文件名称中的track替换为子文件夹名称: 在ChatGPT中输入提示词: 你是一个…

小程序提升“用户粘性”的10个方法

个性化推荐:通过用户行为数据分析,提供个性化的内容和推荐,以增加用户的兴趣和参与度。优惠和奖励:提供用户独有的优惠,折扣和奖励措施,如会员等级制度,积分制度等,以激励用户持续使…

电磁铁的使用注意事项

电磁铁是比较常用的磁场设备,在与磁性研究相关的实验室里,我们能经常看到,那磁场设备在使用的时候,包括各类电磁铁、亥姆霍兹线圈、螺线管等,有什么需要注意的事项呢? 电磁铁设备主要包括电磁铁以及配套电…

第五部分:Tomcat

5.1:JavaWeb 5.1.1:JavaWeb的概念 ①什么是JavaWeb? JavaWeb是指所有通过Java语言编写可以通过浏览器访问的程序的总称 JavaWeb是基于请求和响应来开发的 ②什么是请求? 请求是指客户端给服务器发送数据,叫请求Request ③什么是…

Web的兼容性测试主要测什么?

1.兼容性测试主要测什么? 对于兼容性测试我了解的很少,之前觉得兼容性测试,就是开发出来网站,在不同的浏览器上显示的是否正常,会不会因为浏览器不同,网站的显示样式,功能,获取的数…

BIOS开发笔记 - DDR中的时序参数

通过前一篇文章学习,我们可以大致知道内存条(Module)的组成及SDRAM内部的结构,这一篇再介绍下SDRAM中常见的时序参数以及整个读写操作的流程。 一、外部信号 图1 DDR4的外部线路图 DDR是一种高带宽的传输接口,其外部信号较多,图1是一个DDR4的外部线路图,以下对图中跟通…

使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤)

目录 一、前提二、MySQL 生产安装1,拉取mysql2,查看mysql镜像3, 启动 mysql 容器4,修改mysql的中文编码5,查看验证mysql的中文编码 三、Mysql主机 mysql_master 的安装与配置1, 拷贝master容器2&#xff0c…

chrome 扩展 popup 弹窗的使用

popup的基本使用方法 popup介绍 popup 是点击 browser_action 或者 page_action图标时打开的一个小窗口网页,焦点离开网页就立即关闭,一般用来做一些临时性的交互。 popup配置 V3版本中(V2版本是在 browser_action 中 )&#x…

Python武器库开发-常用模块之base64模块(十四)

常用模块之base64模块(十四) 在Python中,base64是内置的常用的标准模块,base64模块是用来作base64编码解码,常用于小型数据的传输。我们可以直接通过import导入base64模块直接使用 import base64base64模块,除了base64之外&…