修改linux内核代码或者内核模块的时候,搞不好就会造成linux死机崩溃,crash死机后/var/log/kern.log里面不会有任何异常信息记录。这时候kdump就会派上用场了,网上kdump的中英文介绍资料很多,但是很多都是基于系统自带的linux进行说明的,这里记录一下在新编译的内核上使用kdump遇到的问题

1、首先使用ubuntu的config文件编译的内核可以使用kdump

2、在上面的config文件后打开内核编译的DEBUG_INFO选项,编译安装内核后,结果kdmup不起作用,crash后电脑直接卡死没反应,有下面几个现象

通过service --status-all查看,kdump服务成功启动

通过kdump-config show 查看,kdump not ready。

重新启动kdump服务。提示启动成功,但是查看/var/log/syslog,看到有提示"Could not find a free area of memory of  xxxxx",kdump预留内存不足,通过/proc/iomem查看已经预留了crash memory,但是预留的crash memory与syslog中提示的内存非常接近

重新启动笔记本,在grub命令行编辑启动命令,设置crash memory为256M,之前grub配置文件中为128M,重启后,发现kdump服务ok,通过kdump-config show查看kdump 也是ready状态。

通过echo c > /proc/sysrq-trigger触发内核崩溃,看到kdump有响应,但是并不会重启笔记本,也不会记录crash信息

3、既然没有配置DEBUG_INFO时候编译的内核可以kdump,配置DEBUG_INFO后编译的内核反而不能kdump,那么在安装尝试把DEBUG信息去掉

objcopy --strip-debug ./vmlinux.o  (建议先备份vmlinux.o)

make  modules_installs INSTALL_MOD_STRIP=1 install

上面两条命令一个是把内核中的debug信息去掉,另外一个命令则是在安装内核模块的时候,同样把内核模块的debug info去掉,INSTALL_MOD_STRIP这个参数实际上就是从内核makefile中找到的,INSTALL_MOD_STRIP在makefile中就是控制strip-debug是否使能的。

4、经过上面把内核以及内核模块的调试信息去掉后,确认kdump可以正常使用了

  1. root@Inspiron:/home/lybxin# crash doc/ubuntu-compile/vmlinux  /var/crash/201610291718/dump.201610291718
  2. crash 7.1.4
  3. Copyright(C)2002-2015  RedHat,Inc.
  4. Copyright(C)2004,2005,2006,2010  IBM Corporation
  5. Copyright(C)1999-2006  Hewlett-PackardCo
  6. Copyright(C)2005,2006,2011,2012  FujitsuLimited
  7. Copyright(C)2006,2007  VA LinuxSystemsJapan K.K.
  8. Copyright(C)2005,2011  NEC Corporation
  9. Copyright(C)1999,2002,2007  SiliconGraphics,Inc.
  10. Copyright(C)1999,2000,2001,2002  MissionCriticalLinux,Inc.
  11. This program is free software, covered by the GNU GeneralPublicLicense,
  12. and you are welcome to change it and/or distribute copies of it under
  13. certain conditions.  Enter"help copying" to see the conditions.
  14. This program has absolutely no warranty.  Enter"help warranty"for details.
  15. GNU gdb (GDB)7.6
  16. Copyright(C)2013FreeSoftwareFoundation,Inc.
  17. LicenseGPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  18. This is free software: you are free to change and redistribute it.
  19. There is NO WARRANTY, to the extent permitted by law.  Type"show copying"
  20. and "show warranty"for details.
  21. This GDB was configured as "x86_64-unknown-linux-gnu"...
  22.      KERNEL: doc/ubuntu-compile/vmlinux        
  23.    DUMPFILE:/var/crash/201610291718/dump.201610291718  [PARTIAL DUMP]
  24.        CPUS:4
  25.        DATE:SatOct2917:17:442016
  26.      UPTIME:00:03:39
  27. LOAD AVERAGE:0.69,1.06,0.50
  28.       TASKS:582
  29.    NODENAME:Inspiron
  30.     RELEASE:4.4.13+
  31.     VERSION:#35 SMP Fri Oct 28 23:13:30 CST 2016
  32.     MACHINE: x86_64  (2526Mhz)
  33.      MEMORY:3.9 GB
  34.       PANIC:"sysrq: SysRq : Trigger a crash"
  35.         PID:2656
  36.     COMMAND:"bash"
  37.        TASK: ffff880081543e80  [THREAD_INFO: ffff880124db8000]
  38.         CPU:0
  39.       STATE: TASK_RUNNING (SYSRQ)
  40. crash> bt
  41. PID:2656   TASK: ffff880081543e80  CPU:0   COMMAND:"bash"
  42. #0 [ffff880124dbbaf0] machine_kexec at ffffffff8105ae6b
  43. #1 [ffff880124dbbb50] crash_kexec at ffffffff8110cb12
  44. #2 [ffff880124dbbc20] oops_end at ffffffff81030c29
  45. #3 [ffff880124dbbc48] no_context at ffffffff81069c35
  46. #4 [ffff880124dbbca8] __bad_area_nosemaphore at ffffffff81069f00
  47. #5 [ffff880124dbbcf0] bad_area at ffffffff8106a0d3
  48. #6 [ffff880124dbbd18] __do_page_fault at ffffffff8106a5eb
  49. #7 [ffff880124dbbd70] do_page_fault at ffffffff8106a6b2
  50. #8 [ffff880124dbbd90] page_fault at ffffffff81832178
  51.    [exception RIP: sysrq_handle_crash+22]
  52.    RIP: ffffffff814f42b6  RSP: ffff880124dbbe48  RFLAGS:00010282
  53.    RAX:000000000000000f  RBX:0000000000000063  RCX:0000000000000000
  54.    RDX:0000000000000000  RSI: ffff880137c0dc78  RDI:0000000000000063
  55.    RBP: ffff880124dbbe48   R8:0000000000000002   R9:00000000000003ed
  56.    R10:0000000000000001  R11:00000000000003ed  R12:0000000000000004
  57.    R13:0000000000000000  R14: ffffffff81ebada0  R15:0000000000000000
  58.    ORIG_RAX: ffffffffffffffff  CS:0010  SS:0018
  59. #9 [ffff880124dbbe50] __handle_sysrq at ffffffff814f4a8a
  60. #10 [ffff880124dbbe80] write_sysrq_trigger at ffffffff814f4f0f
  61. #11 [ffff880124dbbe98] proc_reg_write at ffffffff81279782
  62. #12 [ffff880124dbbeb8] __vfs_write at ffffffff8120b438
  63. #13 [ffff880124dbbec8] vfs_write at ffffffff8120bdc9
  64. #14 [ffff880124dbbf08] sys_write at ffffffff8120ca85
  65. #15 [ffff880124dbbf50] entry_SYSCALL_64_fastpath at ffffffff8182fff2
  66.    RIP:00007fe506368a10  RSP:00007ffd28c06838  RFLAGS:00000246
  67.    RAX: ffffffffffffffda  RBX:00000000006f4378  RCX:00007fe506368a10
  68.    RDX:0000000000000002  RSI:00000000011bc408  RDI:0000000000000001
  69.    RBP:00007ffd28c06770   R8:00007fe506637780   R9:00007fe506c6b700
  70.    R10:0000000000000001  R11:0000000000000246  R12:00007fe506c6d5d0
  71.    R13:0000000000000000  R14:00007fe506c8f168  R15:00007ffd28c06798
  72.    ORIG_RAX:0000000000000001  CS:0033  SS:002b

后记:

实际上编译debug info后遇到两个问题,第一个是预留的crash内存不足的问题,另外一个是预留足够内存后虽然kdump服务正常了,但是内核崩溃的时候仍然不能启动kdump服务

对于第一个预留内存不足的问题,后来查看kdump-tools和kexec-tools的源码,原来kdump-config show执行的时候,就是读取的/sys/kernel/kexec_crash_loaded这个文件的值,如果kexec_crash_loaded为0就表示kdump没有处于ready状态。接着查看内核源码,/sys/kernel/kexec_crash_loaded文件对应内核变量kexec_crash_image,而这个变量只会在两个系统调用中进行修改,一个是kexec_load另外一个是kexec_file_load,而我并没有修改kexec相关的代码,因此内核这块出问题的概率比较小。

通过跟踪kdump服务的启动脚本执行过程,原来启动kdump服务最终执行的命令是/bin/systemctl --no-pager start kdump-tools.service ,而systemctl则会通过/run/systemd/private这个socket与init进程通信,init最终又会执行kexec-tools中的kexec程序,在kexec执行的时候则会查找预留的carsh memory,当预留的内存不足的时候就会输出"Could not find a free area of memory of  xxxxx"错误信息,当预留的内存充足的时候,则会执行kexec_load系统调用进行加载。

对于第二个,kdump服务启动后还不能正常使用kdump的问题,打开debug info和debug info对比,发现预留的crash memory位置不同,估计多半和内核的内存机制与kexec机制有关系,这块不太懂了,没有深入研究了。好在单独剥离debug info后可以正常使用kdump。

grub启动文件中crashkernel参数的解析,可以参考内核代码parse_crashkernel

命令备记:

objcopy --only-keep-debug ./vmlinux.o  vmlinux.debug

objcopy --strip-debug ./vmlinux.o

INSTALL_MOD_STRIP=1

strace -f -F -ff -o kdump /bin/systemctl --no-pager start kdump-tools.service

linux/boot/vmlinuz-4.4.13 root=UUID=1ba5f5c5-70c3-4936-b757-821899fe6264 ro  quiet splash crashkernel=384M-:128M $vt_handoff

使用kdump内核调试工具遇到的问题及解决的更多相关文章

  1. 转 -Linux 自检和 SystemTap (强大的内核调试工具)---包含下载地址

    下载: http://www.oschina.net/p/systemtap/ https://sourceware.org/systemtap/ftp/releases/   Linux 自检和 S ...

  2. X5内核浏览器video自动全屏解决办法-canvas

    最近在做手机端上面播放视频的项目,但是在安卓上面,video的播放是脱离页面,置于最顶层的,所以带来了很多问题,为了解决这个问题,查看了多方资料,写了下面简单的demo,方便以后使用. 下面就是运用c ...

  3. 内核调试工具 — kdump & crash

    kdump简介 kdump是系统崩溃的时候,用来转储运行内存的一个工具. 系统一旦崩溃,内核就没法正常工作了,这个时候将由kdump提供一个用于捕获当前运行信息的内核, 该内核会将此时内存中的所有运行 ...

  4. kdump内核转储

    目录 CentOS 7.5 配置Kdump 安装Kdump 安装Kdump图形化 配置保留内存 配置kdump类型 核心转储到本地 核心转储到设备 使用NFS指定核心转储 使用SSH指定核心转储 配置 ...

  5. kdump内核

    什么是kdump?   kdump 是一种先进的基于 kexec 的内核崩溃转储机制.当系统崩溃时,kdump 使用 kexec 启动到第二个内核.第二个内核通常叫做捕获内核,以很小内存启动以捕获转储 ...

  6. 内核调试工具——strace

    简介 strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核 ...

  7. 使用ubuntu16.04配置linux内核和busybox出现错误的解决方法总结

    也许很多人都知道,ARM裸机1期加强版课程用的是ubuntu 16.04,当用这个ubuntu编译内核和制作文件系统的时候会出现一些问题,售后团队用了一天时间找到了如下解决方法.   更多干货关注威信 ...

  8. Centos7内核版安装nginx环境问题及解决方法

    错误信息:./configure: error: C compiler cc is not found解决方案:yum -y install gcc gcc-c++ autoconf automake ...

  9. Linux内核调试:kdump、vmcore、crash、kernel-debuginfo【转】

    转自:https://blog.csdn.net/guowenyan001/article/details/19807555 一.简介 linux内核发送崩溃时,kdump会生成一个内核转储文件vmc ...

随机推荐

  1. Delphi调用爷爷类的方法

    Delphi通过inherited 可以调用父类的方法,但是没有提供直接调用父类的父类的方法(爷爷类),通过变通的方式实现如下: 假设父类是TFather,爷爷类TGrand,调用爷爷类的Write方 ...

  2. 一图看懂hadoop Yarn工作原理

    Hadoop 资源调度框架Yarn运行流程

  3. 手搓一个兔子问题(分享一个C语言问题,持续更新...)

    大家好,我是小七夜,今天就不分享C语言的基础知识了,分享一个比较好玩的C语言经典例题:兔子问题 题目是这样的:说有一个穷苦人这天捉到了一只公兔子,为了能繁衍后代他又买了一只母兔子,后来兔子开始生小兔子 ...

  4. [Golang学习笔记] 06 程序实体3 类型断言和类型转换

    类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...

  5. 20155231 cho3 课下作业

    20155231 cho3 课下作业 4 1 通过输入gcc -S -o main.s main.c 将下面c程序"week0603学号.c"编译成汇编代码 int g(int x ...

  6. 20155333 2016-2017-2 《Java程序设计》第一周学习总结

    <java程序设计>第一周学习总结 学习目标 •了解java基础知识 •了解JVM.JRE与JDK,并下载.安装.测试JDK •了解PATH.CLASSPATH.SOURCEPATH的作用 ...

  7. Oracle下如何设置 log_archive_dest

    一:存在 DB_RECOVERY_FILE_DEST 时,如何设置 LOG_ARCHIVE_DEST: SQL> archive log listデータベース・ログ・モード アーカイブ・モード自 ...

  8. 实时备份工具之inotify+rsync

    1.inotify简介 inotify 是一个从 2.6.13 内核开始,对 Linux 文件系统进行高效率.细粒度.异步地监控机制, 用于通知用户空间程序的文件系统变化.可利用它对用户空间进行安全. ...

  9. AWVS11提取规则文件

    在这里给大家分享一个获取AWVS规则文件的思路.  目前我提取的是17年4月份的扫描规则.   后面如果规则更新,可以自行提取 官网:   https://www.acunetix.com/vulne ...

  10. web中简单wcf的创建和应用

    以前做过wcf控制台作为宿主,今天回顾一下,不过公司用的web直接创建就把这种过程写下来. 第一步:创建wcf页面如图 第二步:创建wcf时候已经自动生成了接口(契约)和实现类(契约),但是我们可以修 ...