kdump就是kernel dump的简称,它是从DDR中直接获取的linux内核数据(系统代码/数据)。分析kdump是定位内核panic问题的有效手段之一,同时,通过kdump研究内核数据结构,也是学习和理解linux原理的好方法。本文将介绍如果在PC机上,针对当前运行的linux系统,建立起kdump调试环境。本文基于Ubuntu系统讲解。

1.系统符号表的获取

解析内核dump,首先需要符号表,也就是未经过压缩的内核镜像,通常我们也叫它vmlinux。通常系统默认并没有自带vmlinux,不过我们可以通过安装系统版本对应的debug包来获取它。

网上搜索了一下vmliux的安装方法,大部分文章都说要安装kernel-debug以及kernel-debug-info,不过后来发现这是redhat对应的安装包,需要手动下载rpm包安装。而在ubuntu下,对应的包名是dbgsym,同样需要手动下载deb包安装:

http://ddebs.ubuntu.com/pool/main/l/linux/

这里需要下载和当前内核版本对应的dbgsym包,使用uname -r可查看当前linux内核版本,本文使用的是4.4.0-87-generic版本的内核。下载对应的deb包后,使用“dpkg -I package.deb” 即可安装,安装完成后,如下路径即是vmlinux符号表:

/usr/lib/debug/boot/vmlinux-4.4.0-87-generic

2.Crash调试工具

kernel dump调试工具主要有Trace32和crash两个,trace32是商业软件,图形化界面,功能强大,但是收费。而crash则是开源工具,且基于命令行模式,但是功能并不逊于Trace32,本文选择crash。

安装方法:sudo apt-get install crash

详细的crash用法:

https://www.dedoimedo.com/computers/crash.html

3.直接调试当前运行内核

通常我们会在内核panic的时候,通过某种机制从内存中抓取内核数据,也就是kdump,然后通过trace32或crash工具来分析它。不过在介绍kdump的获取方法之前,我们先看看如何直接调试内存中的内核,也就是说分析对象不是导出来的kdump文件,而是当前的物理内存。其实很简单,crash工具启动时如果不给它传递kdump文件,那么它默认就是调试当前内存中的内核。su root,然后直接在命令行输入:crash vmlinux-4.4.0-87-generic

现在就可以使用crash来探索内核世界了,常用的crash命令:
help -- 打印第一级帮助信息
help cmd -- 打印cmd命令的具体帮助信息
ps -- 打印当前进程列表,类似shell下单ps
runq -- 打印当前cpu的运行队列信息
task pid -- 显示任务pid的task_struct结构体信息
在我们阅读linux内核书籍的时候,如果结合crash工具直接查看内核数据结构,是不是很酷?笔者一直认为,从数据结构出发,才是学习linux的正道!
 
 

4.生成kdump文件

很多时候,尤其是定位内核panic问题的时候,我们需要在内核崩溃时,保存DDR中的内核数据到文件,用于事后分析,这就是所谓的kdump文件。

在ubuntu系统中,通过安装linux-crashdump工具,我们可以捕捉kdump。Kdump是一个Linux内核崩溃转储机制,这个机制的原理是在内存中保留一块区域,这块区域用来存放capture kernel,当前的内核发生crash后,通过kexec把保留区域的capture kernel运行起来,由capture kernel负责把crash kernel的完整信息--包括CPU寄存器、堆栈数据等--转储到文件中,文件的存放位置可以是本地磁盘,也可以是网络。具体kdump的使用方法可参考如下链接:http://blog.csdn.net/maokexu123/article/details/40829459

配置完kdump后,我们需要做的就是在当前系统中主动触发一次panic,以获取kdump文件。方法是使用sysrq-trigger节点:

echo c > /proc/sysrq-trigger

在ubuntu以及debian上尝试,发现触发后系统一直刮死,并没有重启
网上找到的设置是:
vi /etc/sysctl.conf
#增加此行,以保证此设置持续有效;
#含义是当系统遇到kernel panic时,系统在30秒后reboot;
kernel.panic = 30
 
#修改此参数,,以保证下一次当系统遇到kernel panic后有效;
#以后无需再修改,默认从上面的设置中加载;
vi /proc/sys/kernel/panic
echo 30 > panic
 
设置后貌似可以重启了,但是,重启的时候好像卡住了
会不会是captrue内核有问题?
我们把kdump服务停掉:
service kdump-tools stop
再次触发panic,发现成功重启了
说明是真capture内核捕获kernel dump的时候卡死了
 
等这个问题解决了,再继续更新本文

在Linux-PC上建立kdump调试环境的更多相关文章

  1. Linux服务器上搭建web项目环境

    一.下载并安装jdk 去官网下载linux系统上jdk的安装包jdk-8u181-linux-x64.tar.gz,在Linux的/usr目录下新建文件夹java,可以使用命令:cd /usr    ...

  2. linux系统上安装svn服务器 环境linux+nginx+svnserver

    系统:Ubuntu 12.04 64位 lnmp环境 集成软件:PHP5.4.27.Nginx1.6.0.MySQL5.5.37 阿里云server svnserver有2种执行方式:独立server ...

  3. Linux下搭建FFmpeg开发调试环境

    背景 如果你是一个FFmpeg的使用者,那么绝大部分情况下只需要在你的程序中引用FFmpeg的libav*相关的头文件,然后在编译阶段链接相关的库即可.但是如果你想调试FFmpeg内部相关的逻辑,或者 ...

  4. Linux 服务器上建立用户并分配权限

    查看用户 whoami #要查看当前登录用户的用户名 who am i #表示打开当前伪终端的用户的用户名 who mom likes who 命令其它常用参数 参数 说明 -a 打印能打印的全部 - ...

  5. 在Linux系统上安装配置ant环境

    1.从官网http://ant.apache.org/bindownload.cgi下载tar.gz版ant到本地电脑上 2.通过WinSCP工具将本地电脑上的ant压缩包上传至Linux服务器的/u ...

  6. 搭建Linux+Jexus+MariaDB+ASP.NET[LJMA]环境

    备注:,将我的博客内容整理成册,首先会在博客里优先发布,后续可能的话整理成电子书,主要从linux的最基础内容开始进入Linux的Mono开发方面的话题.本文是我整理博客内容的一篇文章. LJMA 是 ...

  7. linux pc syncy安装问题

    linux pc 上安装syncy遇到的坑 pycurl安装可以指定curl-config,这个是根据自己机器libcurl安装位置确定,不在默认位置时要指定:python setup.py inst ...

  8. 定时备份windows机器上的文件到linux服务器上的操作梳理(rsync)

    由于需要对网络设备做备份,备份文件是放到windows机器上的.现在需要将备份数据同步到linux备份机器上,想到的方案有三种: 1)将windows的备份目录共享出来,然后在linux服务器上进行挂 ...

  9. 绕过限制,在PC上调试微信手机页面

    场景 假设一个手机页面,开发者对其做了限制,导致只能在微信客户端中打开.而众所周知手机上非常不利于调试页面,所以需要能在电脑上打开并进行调试.这里针对常见的三种页面做一下分析,一一绕过其限制,(当然不 ...

随机推荐

  1. Git和SVN之间的区别

    如果你在读这篇文章,说明你跟大多数开发者一样对GIT感兴趣,如果你还没有机会来试一试GIT,我想现在你就要了解它了. GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果 ...

  2. react bootstrap-loader

    1.install npm install bootstrap-loader jquery resolve-url-loader 2.webpack.config.js entry: ['bootst ...

  3. 【dlbook】机器学习基础

    [机器学习基础] 模型的 vc dimension 如何衡量? 如何根据网络结构衡量模型容量?有效容量和模型容量之间的关系? 统计学习理论中边界不用于深度学习之中,原因? 1.边界通常比较松, 2.深 ...

  4. js鼠标拖动(转自刘68)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 从无到有开发自己的Wordpress博客主题---运行环境准备

    目前只做本地开发,只在本地搭建测试环境,最后会在服务器的CentOS中搭建正式环境,我使用的是Mac,最简单的办法就是安装MAMP. 1.下载并安装MAMP 下载地址:https://www.mamp ...

  6. spring 和springmvc 在 web.xml中的配置

    (1)问题:如何在Web项目中配置Spring的IoC容器? 答:如果需要在Web项目中使用Spring的IoC容器,可以在Web项目配置文件web.xml中做出如下配置: <!-- Sprin ...

  7. beego数据输出

    beego数据输出   概览 直接输出字符串 模板数据输出 静态模板数据输出 动态模板数据输出 json格式数据输出 xml格式数据输出 jsonp调用 概览 直接输出字符串 通过beego.Cont ...

  8. SHELL 脚本----常用的命令

    一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂   建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行she ...

  9. POJ1251 Jungle Roads

    解题思路:看懂题意是关键,Kruskal算法,最小生成树模板. 上代码: #include<cstdio> #include<cstring> #include<algo ...

  10. 【解题报告】[动态规划]RQNOJ - PID82 / 又上锁妖塔

    原题地址:http://www.rqnoj.cn/problem/82 解题思路: 简单的动态规划 状态表示:DP[i][0]表示当前在第i层,且当前跳跃状态不可用,此时消耗的最短时间.   DP[i ...