Linux Kdump分析宕机问题案例

2024-01-11 18:36

本文主要是介绍Linux Kdump分析宕机问题案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 查看问题原因
  • 2. 找出哪一行代码触发的宕机
  • 3. 查看宕机函数传入参数的值
    • 方法一:使用struct查看结构体的值
    • 方法二:使用rd命令查看对应内存的值

1. 查看问题原因

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"...WARNING: kernel relocated [680MB]: patching 85605 gdb minimal_symbol valuesplease wait... (patching 85605 gdb minimal_symbol values)KERNEL: /usr/lib/debug/lib/modules/3.10.0-957.el7.x86_64/vmlinuxDUMPFILE: vmcore  [PARTIAL DUMP]CPUS: 2DATE: Fri Jan  5 17:59:15 2024UPTIME: 00:03:25
LOAD AVERAGE: 0.44, 0.67, 0.31TASKS: 490NODENAME: localhost.localdomainRELEASE: 3.10.0-957.el7.x86_64VERSION: #1 SMP Thu Nov 8 23:39:32 UTC 2018MACHINE: x86_64  (3407 Mhz)MEMORY: 3 GBPANIC: "BUG: unable to handle kernel NULL pointer dereference at 0000000000000050"PID: 3943COMMAND: "insmod"TASK: ffff8ebeece52080  [THREAD_INFO: ffff8ebedfa48000]CPU: 0STATE: TASK_RUNNING (PANIC)

其中PANIC直接指出了触发宕机的原因
上述案例中发生崩溃的原因是"BUG: unable to handle kernel NULL pointer dereference at 0000000000000050",即内核发生了不能处理的空指针引用。

2. 找出哪一行代码触发的宕机

  1. 查看堆栈信息
crash> bt
PID: 3943   TASK: ffff8ebeece52080  CPU: 0   COMMAND: "insmod"#0 [ffff8ebedfa4b930] machine_kexec at ffffffffab863674#1 [ffff8ebedfa4b990] __crash_kexec at ffffffffab91ce12#2 [ffff8ebedfa4ba60] crash_kexec at ffffffffab91cf00#3 [ffff8ebedfa4ba78] oops_end at ffffffffabf6c758#4 [ffff8ebedfa4baa0] no_context at ffffffffabf5aa7e#5 [ffff8ebedfa4baf0] __bad_area_nosemaphore at ffffffffabf5ab15#6 [ffff8ebedfa4bb40] bad_area_nosemaphore at ffffffffabf5ac86#7 [ffff8ebedfa4bb50] __do_page_fault at ffffffffabf6f6b0#8 [ffff8ebedfa4bbc0] do_page_fault at ffffffffabf6f915#9 [ffff8ebedfa4bbf0] page_fault at ffffffffabf6b758[exception RIP: create_oops+25]RIP: ffffffffc0854019  RSP: ffff8ebedfa4bca0  RFLAGS: 00010286RAX: 0000000000000000  RBX: ffffffffac418020  RCX: 0000000000036cdfRDX: ffff8ebedfa4bce4  RSI: ffff8ebedfa4bce4  RDI: 0000000000000000RBP: ffff8ebedfa4bcb8   R8: 68737568736e6562   R9: 007568737568736eR10: ffff8ebefa61f120  R11: fffff9f20263a900  R12: ffff8ebee8ef7120R13: ffffffffc0859000  R14: 0000000000000000  R15: ffffffffc0856000ORIG_RAX: ffffffffffffffff  CS: 0010  SS: 0018
#10 [ffff8ebedfa4bcc0] init_module at ffffffffc085909a [oops]
#11 [ffff8ebedfa4bd38] do_one_initcall at ffffffffab80210a
#12 [ffff8ebedfa4bd68] load_module at ffffffffab918f8c
#13 [ffff8ebedfa4beb8] sys_finit_module at ffffffffab919606
#14 [ffff8ebedfa4bf50] system_call_fastpath at ffffffffabf74ddbRIP: 00007fae7c472e29  RSP: 00007fff1b996bd8  RFLAGS: 00010207RAX: 0000000000000139  RBX: 0000000002239240  RCX: 00007fae7c4e4f90RDX: 0000000000000000  RSI: 000000000041a96e  RDI: 0000000000000003RBP: 000000000041a96e   R8: 0000000000000000   R9: 00007fff1b996de8R10: 0000000000000003  R11: 0000000000000206  R12: 0000000000000000R13: 0000000002239220  R14: 0000000000000000  R15: 0000000000000000ORIG_RAX: 0000000000000139  CS: 0033  SS: 002b
  • RIP: 指向造成崩溃的指令地址
  • RDI: 存储函数第一个参数的地址
  • RSI: 存储函数第二个参数的地址
  1. 加载内核模块调试信息
crash> mod -s oops  /root/rlk_lab/oops.koMODULE       NAME                            SIZE  OBJECT FILE
ffffffffc0856000  oops                           12741  /root/rlk_lab/oops.ko
  1. 查看出现问题的代码行号

ffffffffc0854019为堆栈信息中RIP所指地址。在输出信息中我们可以看到触发宕机的代码在oops_test.c文件的第16行。

crash> sym ffffffffc0854019
ffffffffc0854019 (T) create_oops+25 [oops] /root/rlk_lab/oops_test.c: 16

3. 查看宕机函数传入参数的值

堆栈中RDI,RSI分别指向了传入的第一个,第二个参数。

方法一:使用struct查看结构体的值

  1. 使用dis -l命令找到宕机触发点的代码位置
crash> dis -l kfree+316 10
crash> dis -l ffffffffc0748019 10
/root/rlk_lab/oops_test.c: 16
0xffffffffc0748019 <create_oops+25>:    mov    0x50(%rax),%rax
0xffffffffc074801d <create_oops+29>:    mov    %rax,-0x8(%rbp)
  1. 在源码中找到对应文件,查看传入的结构体类型

结合代码我们可以看到,传入的两个参数类型分别是struct vm_area_structstruct mydev_priv

int create_oops(struct vm_area_struct *vma, struct mydev_priv *priv)
{unsigned long flags;flags = vma->vm_flags;printk("flags=0x%lx, name=%s\n", flags, priv->name);return 0;
}
  1. 使用struct命令结合结构体位置,查看传入的结构体数据
crash> struct  mydev_priv ffff95f18619bce4
struct mydev_priv {name = "benshushu\000\377\377\000\275\031\206\361\225\377\377j\342\303'\000\000\000\000\240\360\001\000\000\000\000\000\200a\350\224\361\225\377\377\000\320t\300\377\377\377\377 \200\241\263\377\377\377\377\300\036`\212",i = 10
}

参数的地址由堆栈中的RSIRDI指出。

方法二:使用rd命令查看对应内存的值

crash> rd ffff95f18619bce4
ffff95f18619bce4:  68737568736e6562                    benshush

这篇关于Linux Kdump分析宕机问题案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/595323

相关文章

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序