修改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. ubuntu18.04 没声音解决方案(坑自己版)

    那啥,半个月没开电脑了,这几天打开发现系统没声了 那咋办呢,修一修呗 搜索了下问题,还挺简单的 jiang@ryzen:~$ sudo apt install pavucontrol 打开 jiang ...

  2. Centos7最小化安装之工作站设置

    Centos7最小化安装之工作站设置 实测在Vultr的VPS上正常可用 在Vultr上怎么看桌面 两种解决方法: 使用VNC远程连接 直接使用Vultr的view console功能 我使用的是第二 ...

  3. 学习笔记二:异步FIFO

      , ) //用格雷码的局限性:循环计数深度必须是2的n次幂,否则就失去了每次只变化一位的特性 (wclk,wrstn,wdata,wfull,winc,rclk,rrstn,rdata,rempt ...

  4. 3x3开窗中值滤波器的FPGA硬件实现

    数字逻辑课程的自由设计中,我编写了一个3x3开窗的中值滤波器,处理一副128*128像素值的图像,并且最终可以在FPGA上板实现. 中值滤波的本质就是对于一个n*n的窗口,将其内部的值进行排序,取中位 ...

  5. ASP.NET的服务端验证(干货)

    最近有项目需要使用.net的web,啥也不说,直接开始学习.net的mvc框架.感觉微软的web项目其实还是很好用的,今天和大家分享一下服务端验证的事情.其实原理就是用到了c#的特性,特性不用多说,大 ...

  6. Python之路(四)--->list、元组、字典

    好久没有更新了,感觉自己写的东西并没有太多人看,可能是因为写的不好,也可能是太基础了.学习是一个漫长的过程,结果结果固然重要,但是更重要的是在学习的过程中所学到方法,这些方法在以后的生活还是工作中都能 ...

  7. 20155320 2016-2017-2《Java程序设计》第十二周课堂实践项目

    20155320 2016-2017-2<Java程序设计>第十二周课堂实践项目 1.修改教材P98 Score2.java, 让执行结果数组填充是自己的学号: 2.在IDEA中以TDD的 ...

  8. Java线程和多线程(十三)——Callable,Future,FutureTask

    在Java多线程之中,Callable和Future的使用时非常广泛的.在之前的文章中,我们了解了关于Java线程池基础的一些内容,知道如何提交Runnable的任务.但是,Runnable的任务是无 ...

  9. MySQL入门篇(四)之MySQL主从复制

    一.MySQL主从复制原理 随机站点访问量的鞥集啊,单台的MySQL服务器压力也不断地增加,此时需要对MySQL进行优化,如果在MySQL优化无明显改善时期,可以使用高可用.主从复制.读写分离.分库分 ...

  10. Redis可视化客户端管理Web UI工具收集

    https://github.com/uglide/RedisDesktopManager(推荐,全平台支持的桌面UI工具) Web方案: https://github.com/ErikDubbelb ...