内核调试工具crash使用

news2024/11/26 15:40:25

内核调试工具crash使用

    • 前言
    • 初识
      • 获取vmlinux
      • Dwarf Error: wrong version in compilation unit header (is 5, should be 2, 3, or 4)
    • 其他

前言

在编写内核驱动的过程中,时不时就导致内核崩溃,也没啥好的调试方法,要么dmesg打印内核日志,要么搭建kgdb环境调试,但kgdb比较繁琐,dmesg有时候也不能打印内核堆栈,故调试内核纯看运气,如果是能稳定复现的bug还好调试,最怕的就是测试程序刚开始跑的好好的,突然鼠标动不了了,这个时候就知道糟了。之前的思路是一直时快速刷新dmesg以求能看到内核崩溃时日志打印,但没有成功过。后面有一次面试的时候面试官提到了crash这一内核调试工具,看起来还挺有用,故记录一下使用过程。

环境说明:
虚拟机1:

cat /proc/version
Linux version 5.15.0-69-generic (buildd@lcy02-amd64-071) (gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #76~20.04.1-Ubuntu SMP Mon Mar 20 15:54:19 UTC 2023

初识

运行环境:虚拟机1
参考博客:
官方文档:Kernel crash dump
ubuntu 20.04 启用kdump服务及下载vmlinux
crash调试内核入门-老司机带你上车

实际上crash的安装步骤非常简单,安装linux-crashdump后重启即可

apt install linux-crashdump # 安装linux-crashdump
reboot # 重启
# 验证
kdump-config show 
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr: 0xb3000000
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinuz-5.15.0-69-generic
kdump initrd: 
   /var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-5.15.0-69-generic
current state:    ready to kdump

kexec command:
  /sbin/kexec -p --command-line="BOOT_IMAGE=/boot/vmlinuz-5.15.0-69-generic root=UUID=70b5c7aa-174c-45ff-84de-ea3325883bc6 ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet reset_devices systemd.unit=kdump-tools-dump.service nr_cpus=1 irqpoll nousb" --initrd=/var/lib/kdump/initrd.img /var/lib/kdump/vmlinuz

cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-5.15.0-69-generic root=UUID=70b5c7aa-174c-45ff-84de-ea3325883bc6 ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet crashkernel=512M-:192M


dmesg | grep -i crash
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.15.0-69-generic root=UUID=70b5c7aa-174c-45ff-84de-ea3325883bc6 ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet crashkernel=512M-:192M
[    0.006128] Reserving 192MB of memory at 2864MB for crashkernel (System RAM: 8191MB)
[    0.574934] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-5.15.0-69-generic root=UUID=70b5c7aa-174c-45ff-84de-ea3325883bc6 ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet crashkernel=512M-:192M

安装过程只需要简单看一看官方文档即可

# 试验kdump是否有效,主动触发kernel panic
cat /proc/sys/kernel/sysrq
176
echo c > /proc/sysrq-trigger

# 自动重启后生成如下文件
root@ubuntu /boot# cd /var/crash/
root@ubuntu /v/crash# ls
202305201923/  kdump_lock  kexec_cmd  linux-image-5.15.0-69-generic-202305201923.crash
root@ubuntu /v/crash# cd 202305201923/
root@ubuntu /v/c/202305201923# ls
dmesg.202305201923  dump.202305201923

# dmesg.202305201923
[  150.144897] rfkill: input handler disabled
[  235.080620] sysrq: Trigger a crash
[  235.080633] Kernel panic - not syncing: sysrq triggered crash
[  235.080638] CPU: 3 PID: 6014 Comm: fish Kdump: loaded Not tainted 5.15.0-69-generic #76~20.04.1-Ubuntu
[  235.080645] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 07/22/2020
[  235.080650] Call Trace:
[  235.080655]  <TASK>
[  235.080660]  dump_stack_lvl+0x4a/0x63
[  235.080672]  dump_stack+0x10/0x16
[  235.080676]  panic+0x149/0x321
[  235.080685]  sysrq_handle_crash+0x1a/0x20
[  235.080694]  __handle_sysrq.cold+0xb4/0x18e
[  235.080702]  write_sysrq_trigger+0x28/0x40
[  235.080706]  proc_reg_write+0x6a/0xa0
[  235.080712]  vfs_write+0xb9/0x270
[  235.080718]  ksys_write+0x67/0xf0
[  235.080724]  __x64_sys_write+0x1a/0x20
[  235.080728]  do_syscall_64+0x5c/0xc0
[  235.080735]  ? do_syscall_64+0x69/0xc0
[  235.080741]  ? irqentry_exit_to_user_mode+0x9/0x20
[  235.080746]  ? irqentry_exit+0x1d/0x30
[  235.080750]  ? exc_page_fault+0x89/0x170
[  235.080754]  entry_SYSCALL_64_after_hwframe+0x61/0xcb
[  235.080761] RIP: 0033:0x7f8e32f2432f
[  235.080767] Code: 89 54 24 18 48 89 74 24 10 89 7c 24 08 e8 29 fd ff ff 48 8b 54 24 18 48 8b 74 24 10 41 89 c0 8b 7c 24 08 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 2d 44 89 c7 48 89 44 24 08 e8 5c fd ff ff 48
[  235.080772] RSP: 002b:00007f8e22ffcda0 EFLAGS: 00000293 ORIG_RAX: 0000000000000001
[  235.080778] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f8e32f2432f
[  235.080782] RDX: 0000000000000002 RSI: 0000555cf0465e58 RDI: 0000000000000009
[  235.080785] RBP: 0000000000000002 R08: 0000000000000000 R09: 000000006469809d
[  235.080788] R10: 0000000000000000 R11: 0000000000000293 R12: 0000000000000009
[  235.080791] R13: 0000555cf0465e58 R14: 0000555cf0389560 R15: 00007f8e22ffcfc0
[  235.080797]  </TASK>

接下来就是分析dump文件,可惜我并没有成功。

使用crash分析dump文件,还需要vmlinux文件
在这里插入图片描述
用法类似于crash dump vmlinux

crash --help
USAGE:

  crash [OPTION]... NAMELIST MEMORY-IMAGE[@ADDRESS]     (dumpfile form)
  crash [OPTION]... [NAMELIST]                          (live system form)

OPTIONS:

  NAMELIST
    This is a pathname to an uncompressed kernel image (a vmlinux
    file), or a Xen hypervisor image (a xen-syms file) which has
    been compiled with the "-g" option.  If using the dumpfile form,
    a vmlinux file may be compressed in either gzip or bzip2 formats.

  MEMORY-IMAGE
    A kernel core dump file created by the netdump, diskdump, LKCD
    kdump, xendump or kvmdump facilities.

获取vmlinux

方法1: apt下载方法(失败)
在这里插入图片描述
Ubuntu安装上的vmlinux在哪里?
Where is vmlinux on my Ubuntu installation?

apt-get install linux-image-$(uname -r)-dbgsym
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package linux-image-5.15.0-69-generic-dbgsym
E: Couldn't find any package by glob 'linux-image-5.15.0-69-generic-dbgsym'
E: Couldn't find any package by regex 'linux-image-5.15.0-69-generic-dbgsym'

方法2: 下载ddeb包
在这里插入图片描述
网址:http://ddebs.ubuntu.com/pool/main/l/linux/
在这里插入图片描述
在这里插入图片描述

没找到amd64架构的linux-image-5.15.0-69-generic-dbgsym,只好下了一个unsigned版本的,下个比较慢,翻墙的话快一点。

之后dpkg -i安装

root@ubuntu /u/l/d/boot# cd /usr/lib/debug/boot/
root@ubuntu /u/l/d/boot# ls -lah
-rw-r--r-- 1 root root 705M Mar 17 09:56 vmlinux-5.15.0-69-generic

Dwarf Error: wrong version in compilation unit header (is 5, should be 2, 3, or 4)

使用crash分析dump文件

crash /usr/lib/debug/boot/vmlinux-5.15.0-69-generic dump.202305201923

crash 7.2.8
Copyright (C) 2002-2020  Red Hat, Inc.
Copyright (C) 2004, 2005, 2006, 2010  IBM Corporation
Copyright (C) 1999-2006  Hewlett-Packard Co
Copyright (C) 2005, 2006, 2011, 2012  Fujitsu Limited
Copyright (C) 2006, 2007  VA Linux Systems Japan K.K.
Copyright (C) 2005, 2011  NEC Corporation
Copyright (C) 1999, 2002, 2007  Silicon Graphics, Inc.
Copyright (C) 1999, 2000, 2001, 2002  Mission Critical Linux, Inc.
This program is free software, covered by the GNU General Public License,
and you are welcome to change it and/or distribute copies of it under
certain conditions.  Enter "help copying" to see the conditions.
This program has absolutely no warranty.  Enter "help warranty" for details.
 
GNU gdb (GDB) 7.6
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu"...
gdb called without error_hook: Dwarf Error: wrong version in compilation unit header (is 5, should be 2, 3, or 4) [in module /usr/lib/debug/boot/vmlinux-5.15.0-69-generic]
Dwarf Error: wrong version in compilation unit header (is 5, should be 2, 3, or 4) [in module /usr/lib/debug/boot/vmlinux-5.15.0-69-generic]

crash: /usr/lib/debug/boot/vmlinux-5.15.0-69-generic: no debugging data available

crash内嵌的gdb版本过低(7.6),只支持dwarf 2 3 4版本,不支持5版本

相关博客推荐:从Dwarf Error说开去

objdump --dwarf=info /usr/lib/debug/boot/vmlinux-5.15.0-69-generic | more

/usr/lib/debug/boot/vmlinux-5.15.0-69-generic:     file format elf64-x86-64

Contents of the .debug_info section:

  Compilation Unit @ offset 0x0:
   Length:        0x1e (32-bit)
   Version:       2
   Abbrev Offset: 0x0
   Pointer Size:  8
 <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <c>   DW_AT_stmt_list   : 0x0
    <10>   DW_AT_ranges      : 0x0
    <14>   DW_AT_name        : (indirect string, offset: 0x0): /build/linux-DADscI/linux-5.15.0/arch/x86/kernel/head_64.S
    <18>   DW_AT_comp_dir    : (indirect string, offset: 0x3b): /build/linux-DADscI/linux-5.15.0/debian/build/build-generic
    <1c>   DW_AT_producer    : (indirect string, offset: 0x77): GNU AS 2.38
    <20>   DW_AT_language    : 32769    (MIPS assembler)
  Compilation Unit @ offset 0x22:
   Length:        0xd225 (32-bit)
   Version:       5
   Abbrev Offset: 0x12
   Pointer Size:  8
 <0><2e>: Abbrev Number: 130 (DW_TAG_compile_unit)
    <30>   DW_AT_producer    : (indirect string, offset: 0x2e88): GNU C89 11.3.0 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -m64 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup -mtune=generic -mno-red-zone -mcmodel=kernel -mindirect-branch=thunk-extern -mindirect-branc
h-register -mindirect-branch-cs-prefix -mfunction-return=thunk-extern -mharden-sls=all -mrecord-mcount -mfentry -march=x86-64 -g -gdwarf-5 -O2 -std=gnu90 -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE -fcf-protection=none -falign-jumps=1 -falign-loops=1 -fno-asynchronous-unwind-tables -fno-ju
mp-tables -fno-delete-null-pointer-checks -fno-allow-store-data-races -fstack-protector-strong -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-stack-clash-protection -fno-inline-functions-called-once -fno-strict-overflow -fstack-check=no -fconserve-stack -fno-stack-protector -fsanitize=bounds
 -fsanitize=shift -fsanitize=bool -fsanitize=enum
    <34>   DW_AT_language    : 1        (ANSI C)
    <35>   DW_AT_name        : (indirect line string, offset: 0x0): /build/linux-DADscI/linux-5.15.0/arch/x86/kernel/head64.c
    <39>   DW_AT_comp_dir    : (indirect line string, offset: 0x3a): /build/linux-DADscI/linux-5.15.0/debian/build/build-generic
    <3d>   DW_AT_ranges      : 0x2f0
    <41>   DW_AT_low_pc      : 0x0
    <49>   DW_AT_stmt_list   : 0x222
 <1><4d>: Abbrev Number: 46 (DW_TAG_base_type)
    <4e>   DW_AT_byte_size   : 8
    <4f>   DW_AT_encoding    : 7        (unsigned)
    <50>   DW_AT_name        : (indirect string, offset: 0x469a): long unsigned int
 <1><54>: Abbrev Number: 20 (DW_TAG_const_type)

在这里插入图片描述

其他

在这里插入图片描述

Linux内核映像vmlinux、Image、zImage、uImage区别

grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行
grep -B 5 foo file 显示foo及前5行
grep -A 5 foo file 显示foo及后5行

linux image中的signed与unsigned,之前一直以为是有符号与无符号,觉得很怪,后面才知道是签名与未签名
我应该安装未签名的二进制文件吗?

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

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

相关文章

socket | 网络套接字、网络字节序、sockaddr结构

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

量化论文学习之《基于 CNN-LSTM 混合模型的股价 预测》

主要原理 CNN-LSTM 混合模型首先使用 CNN 来提取时间序列数据的特征&#xff0c;然 后将特征输入进 LSTM 模型中来进行下一交易日股票收盘价的预测。 数据处理 使用数据 作者发现加入volume,pctChg后效果变差&#xff0c;可能原因是加入了相关性较低的特征后造成了数据冗余…

Ubuntu挂载阿里云盘

目录 所需环境安装docker安装rclone获取阿里云盘token 获取docker镜像并运行获取本机IP信息总结rclone配置挂载网盘到本地文件夹开机启动 所需环境 安装docker 使用官方脚本进行全自动安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh安装r…

Spring Boot 可执行 Jar 包运行原理

Spring Boot 有一个很方便的功能就是可以将应用打成可执行的 Jar。那么大家有没想过这个 Jar 是怎么运行起来的呢&#xff1f;本篇博客就来介绍下 Spring Boot 可执行 Jar 包的运行原理。 打可执行 Jar 包 将 Spring Boot 应用打成可执行 Ja r包很容易&#xff0c;只需要在 p…

数字信号处理基础(一):常用信号产生

目录 1. 写在前面2. 连续信号和离散信号2.1连续信号2.2 离散信号 3. 常用信号的产生3.1 单位脉冲序列3.2 单位阶跃序列3.3 指数函数3.4 正弦信号和余弦信号3.5 sinc函数3.6 矩形脉冲信号 4. 信号卷积5. 完整代码 1. 写在前面 为了更好的理解通信原理系列文章&#xff0c;在此补…

28 SQL——表子查询

create table dept(id int primary key auto_increment,name varchar(15))comment 部门;insert into dept(id, name) values (1,研发部),(2,市场部),(3,财务部),(4,销售部),(5,总经办),(6,人事部);create table staff (id int primary key auto_increment commentID,name …

使用Mathtype公式编辑器生成CSDN中的数学公式

使用Mathtype公式编辑器生成CSDN中的数学公式 在CSDN中输入数学公式&#xff0c;直接使用LaTeX编辑输入公式有一些难度&#xff0c;如果你熟悉Mathtype公式编辑器&#xff0c;那么在CSDN文档中输入数学公式也变的相对容易。 下面我们举例说明使用Mathtype转换输入CSDN的公式。…

Weex工具链的奥秘

在2017年1月12日 Weex Conf 2017上&#xff0c;来自阿里的卜道依据Weex开发中的痛点介绍了Weex的打包和插件机制&#xff0c;同样来自阿里的归影介绍了Weex的调试工具Devtools&#xff0c;共同揭秘了Weex的工具链。本文是卜道和归影关于Weex工具链实践的分享整理。 Weexpack与…

MyBatis各种类型查询数据的数据绑定

文章目录 1、前言2、查询一个实体类对象字段名和属性名无法映射处理方式一&#xff1a;起别名方式二&#xff1a;使用全局配置文件配置映射规则方式三&#xff1a;自定义resultmap 3、查询一个list集合4、查询单个数据5、查询一条数据为map集合6、 查询多条数据为map集合方式一…

Python中使用Scipy模块中root函数求解非线性方程的解法举例

Python中使用Scipy模块中root函数求解非线性方程的解法举例 Python中的SciPy模块功能强大&#xff0c;下面举例说明使用该模块求解非线性方程或非线性方程组。在求解时候&#xff0c;用到scipy.optimize模块中的root函数。 1.root函数的调用格式 调用它们的格式为 from scipy…

使用MinIO文件存储系统【完成视频断点续传】业务逻辑

目录 视频上传 接口一&#xff1a;检查该视频/媒资文件是否已经上传完成 接口二&#xff1a;检查视频分块是否已经在minio中已经存在 接口三&#xff1a;上传分块文件到minio中&#xff08;已经上传的分块会在接口二进行校验&#xff09; 接口四&#xff1a;合并上传的分块…

git生成密钥方法

1、密钥生成 打开Git Bash&#xff0c;查看ls ~/.ssh下是否有密钥文件id_rsa*&#xff0c;有的话可先进行备份。 然后用如下命令生成新密钥&#xff1a; ssh-keygen -t rsa -C "your_emailexample.com" 参数含义&#xff1a; -t 指定密钥类型&#xff0c;默认是 …

chatgpt赋能Python-pythonbif

Python Bif: 简介和使用指南 Python Bif是一种用于机器学习和数据科学的强大包。它提供了一些重要的功能&#xff0c;例如分类、集成和回归。这篇文章将向您介绍Python Bif的主要特性和如何使用它来完成各种数据科学任务。 什么是Python Bif&#xff1f; Python Bif是一个通…

Spring源码阅读:AOP原理

一、概述 以下便是Spring Aop的流程&#xff0c;下面我将一一介绍下面的各个方法。 下面是流程中的主要方法。 二、测试代码 下面我将写一个例子介绍Spring Aop的流程。 被增强类&#xff1a; public class MyCalculator {public Integer add(Integer i, Integer j) throw…

逼近GPT-4!BLOOMChat: 开源可商用支持多语言的大语言模型

背景 SambaNova和Together这2家公司于2023.05.19开源了可商用的支持多语言的微调模型BLOOMChat。 SambaNova这家公司专注于为企业和政府提供生成式AI平台&#xff0c;Together专注于用开源的方式打造一站式的foundation model&#xff0c;赋能各个行业。 OpenAI的GPT-4和Goo…

【将maven源改为国内阿里云镜像】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. 如何配置Maven镜像&#xff1f; 2. Idea中m…

【Java入门】初识Java

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Java入门篇系列&#xff0c;该专栏主要讲解&#xff1a;什么是java、java的数据类型与变…

MATLAB|004|MATLAB M-Files|MATLAB数据类型

MATLAB M-Files 我们一直强调MATLAB是一个功能强大的编程语言及交互式计算环境&#xff0c;之前学习的内容中&#xff0c;我们学会了在 MATLAB 命令提示符下输入命令&#xff0c;而且我们主要是把MATLAB环境作为一个计算器使用。其实&#xff0c;MATLAB 还允许写入到一个文件中…

5分钟掌握利用pycharm插件BitoAI 实现chatgpt自动编写代码

一、BitoAI 简介 最近出现了一款新型编程助手BitoAI。今天的主要内容就是给大家介绍它&#xff0c;号称 IDE 的“瑞士军刀”&#xff0c;可以提升开发 10 倍的效率。 简言之它的强大之处就是可以通过类似于ChatGPT对话的方式来编写代码&#xff0c;分析代码&#xff0c;生成代…

Flutter控件之Tab选项卡封装

Tab选项卡&#xff0c;这是一个非常常见且权重很高的一个组件&#xff0c;随便打开一个App&#xff0c;比如CSDN&#xff0c;如下图&#xff0c;首页顶部就是一个Tab选项卡&#xff0c;这个功能可以说&#xff0c;几乎每个App都会存在。 在Android中&#xff0c;我们可以使用Ta…