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. linux下vim对于意外退出的文档的再次开启

    转载的: 1.对于同一个文件如果上次已经打开,而未关闭的情况下,又打开该文件进行编辑时,会出现如下提醒: 这是由于已经打开但未闭关的文件,会在其目录下出现一个.swp的文件,由于是属于隐藏文件,可以用 ...

  2. webservice SOAP WSDL UDDI简介

    WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...

  3. 20165210 Java第四次实验报告

    20165210 实验四 Android程序设计 实验步骤 第24章:初识Android 任务一:完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 学 ...

  4. js中的函参(arguments)

    函参,顾名思义,就是函数的参数,一般我们的js函数这么写: function sum(a,b){ console.log(a+b); } 不难看出,这实现了两个数的相加,比如sum(1,2),打印结果 ...

  5. 从微软官网下载VS离线安装包的方法

    这里描述是包括所有版本,截图以下载VS2017社区版为例: ①登入VS官网下载页面,选择需要的版本点击下载,下载页点此进入. ②下载完成后,打开下载文件所在文件夹,Windows 8.1及以上版本用户 ...

  6. python 中出现 “IndentationError: expected an indented block” 问题

    python 学习 在定义Python函数的时候如下 >>>def hello() . . .print "hello" 这样会报错的,报错如下: Indenta ...

  7. 项目中使用的ajax代码_:觉得还好

    POST>> submitHandler:function(form){ var username = $('#user_name').val(); var password = $('# ...

  8. cowboy实现websocket

    使用cowboy实现websocket主要实现以下回调函数 下面的函数返回值要具体弄清楚原因参考 websocket具体协议  主要就是两个部分 握手和数据传输 -export([init/3]).  ...

  9. ehchache和redis

    Ehcache 在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS中取出来的高花费.高延迟采取的一种缓存方案.正因为Ehcache具有健壮性(基于java开发).被认证(具有apa ...

  10. 利用DAC(Data-tier Application)实现数据库结构迁移

    从一个存在的库,抽取其表结构,对象,权限等,再部署成一个不包含数据的"空库"的方法有很多种.如自带的Generate Scripts功能,自定义脚本提取创建脚本等. 在实际使用中, ...