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

来源:互联网 发布:杭州java培训机构 编辑:程序博客网 时间:2024/06/11 14:43

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.基本调试命令

命令 参数 示例 备注 go vaddr go 0xxxxxxxx 如没有设置断点,此命令将离开KDB环境,切换到正常状态 ss None ss 单步调试,只执行一条指令,结合断点使用 ssb None ssb 单步调试,执行到分支或者函数调用时停止,结合断点使用

b.内存操作命令

命令 参数 示例 备注 md vaddr [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.堆栈操作命令

命令 参数 示例 备注 bt vaddr bt 如果不指定参数,则显示当前的堆栈调用操作,如果指定地址则显示地址的堆栈调用 btp pid bt 630 显示630号进程的堆栈调用 bta None bta 显示所有进程的堆栈调用

d.断点操作命令

命令 参数 示例 备注 bp vaddr bt 0xffffffffbfc00400 设置断点,直接输入bp可显示断点 bl vaddr bl 显示断点 bc bpnum bc 0 bc * 清除断点#0,*表示清除所有的断点 bd bpnum bd 0 使断点#0无效 be bpnum be 0 激活断点#0

e.系统命令&&寄存器操作

命令 参数 示例 备注 env None env 显示当前KDB的环境变量 set count set MDCOUNT=1 设置KDB环境变量 help help 显示当前KDB帮助文档 cpu cpunum cpu 15 切换到cpu15 ps flags ps 显示当前的活动的进程。包括pid、父进程pid、CPU号、当前状态,以及对应的线程,命令源! pid pidnum pid 483 切换到483号进程 lsmod None lsmod 查看当前系统加载过的驱动模块 reboot None reboot 重启 rd c/u/d rd 显示所有进入kdb调试器时该点所设置的所有通用寄存器的值 rm reg contents rm 修改寄存器 ef vaddr ef 显示异常帧

f.反汇编命令

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

4、调试小技巧

5、Q & A

1、有没有键盘快捷键可以直接进入KDB?
有. CTRL + Break..
2、

By: Keven - 点滴积累

1 0