您的位置:首页 > 其它

内核调试番外篇 - KDB的介绍与简单使用

2016-02-16 21:47 609 查看
From: 内核&调试调试

1、什么是 KDB?

kdb是一个Linux系统的内核调试器,它是由SGI公司开发的遵循GPL许可证的开放源码调试工具。kdb嵌入在Linux内核中,为内核&&驱动程序员提供调试手段。它适合于调试内核空间的程序代码,譬如进行设备驱动程序调试,内核模块的调试等。

2、为什么要用KDB?

Bug处处有,不同人的编码思维,以及架构思维!总是会导致Bug的出现,Bug就像小强一样,永远杀不完!也许今天你的架构能支持当前业务,可是明天突然流量暴增,你那套架构就已经是Bug了!

对程序员而言,Bug远远没有到达上述那种高深的地步,架构有架构师!程序员往往只需要保证我们自己的那一亩三分田地的代码是OK的!不管业务需求,不管风吹雨打!有的程序员每天都在push代码,可是正儿八斤高效的代码极其少,有的程序员甚至可笑的说,我怎么着也是写过xx万行代码的大牛!笑而不语。

在我看来,高效代码就是结合需求在不断的压力测试中慢慢改进,这样的代码才是优秀代码!还有一个就是判断一个程序员是否算是程序员的时候,就应该问他解决过的Bug,以及解决Bug的途径!没错,调试工具这里就显得很重要~ 一个好的程序员必是一个好的调试工程师!同样的问题,好的程序员往往10分钟就能搞定,而Low的程序员只会说:”这不可能啊、我的代码没问题啊、见鬼了、我的代码肯定没问题”之类的话!

KDB做为一款内核级别的调试器,对于内核程序员 && 驱动程序员的帮助非常大,KDB的主要优点包括它允许进行内存地址和寄存器修改,并且可以设置堆栈,我本人最喜欢的一个功能就是反汇编了。关于KDB一些使用心得我也会在后续慢慢写出来!

3、开始使用KDB

内核在3.x中已经默认自带KDB了,所以我们只需要开启KDB相关的宏即可,再也不需要像2.6.x的时候去下载KDB的补丁了!

打开宏
CONFIG_KGDB_KDB
,重新编译内核即可!

3.1、启动KDB

echo g > /proc/sysrq-trigger


3.2、命令介绍

a.基本调试命令

命令参数示例备注
govaddrgo 0xxxxxxxx如没有设置断点,此命令将离开KDB环境,切换到正常状态
ssNoness单步调试,只执行一条指令,结合断点使用
ssbNonessb单步调试,执行到分支或者函数调用时停止,结合断点使用
b.内存操作命令

命令参数示例备注
mdvaddr [line-count [output-radix]]md 0xffffffffbfc00400 1 16显示内存内容,如果不指定参数,将使用缺省!
第一个参数为地址显示行数(缺省为4行),每多一行就会地址偏移0x10!

第二个参数是以几进制显示,支持的有(8,10,16)|

|md[1 - 8]| vaddr [line-count [output-radix]]| md4 0xffffffffbfc00400 1 16

结果:

00000003 0000000| 此系列命令为md的扩展,md后面的常数表示显示的内存按照常数个字节常数个字节的显示!|

|mds| vaddr [line-count [output-radix]]| mds 0xffffffff8097c0a0| 以符号的形式显示内存内容,每行只显示一个符号!|

|mm| vaddr contents| mm 0xffffffffbfc00400 0x1| 修改内存地址的内容|

|mdp| vaddr | mdp vaddr |mdp 0x1fc00400| 读取物理地址|

c.堆栈操作命令

命令参数示例备注
btvaddrbt如果不指定参数,则显示当前的堆栈调用操作,如果指定地址则显示地址的堆栈调用
btppidbt 630显示630号进程的堆栈调用
btaNonebta显示所有进程的堆栈调用
d.断点操作命令

命令参数示例备注
bpvaddrbt 0xffffffffbfc00400设置断点,直接输入bp可显示断点
blvaddrbl显示断点
bcbpnumbc 0bc * 清除断点#0,
*表示清除所有的断点
bdbpnumbd 0使断点#0无效
bebpnumbe 0激活断点#0
e.系统命令&&寄存器操作

命令参数示例备注
envNoneenv显示当前KDB的环境变量
setcountset MDCOUNT=1设置KDB环境变量
helphelp显示当前KDB帮助文档
cpucpunumcpu 15切换到cpu15
psflagsps显示当前的活动的进程。包括pid、父进程pid、CPU号、当前状态,以及对应的线程,命令源!
pidpidnumpid 483切换到483号进程
lsmodNonelsmod查看当前系统加载过的驱动模块
rebootNonereboot重启
rdc/u/drd显示所有进入kdb调试器时该点所设置的所有通用寄存器的值
rmreg contentsrm修改寄存器
efvaddref显示异常帧
f.反汇编命令

命令参数示例备注
idvaddrid 0xffffffffc0267cd8反汇编当前地址

4、调试小技巧

5、Q & A

1、有没有键盘快捷键可以直接进入KDB?

有. CTRL + Break..

2、

By: Keven - 点滴积累
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: