内核调试番外篇 - KDB的介绍与简单使用
2016-02-16 21:47
609 查看
From: 内核&调试调试
对程序员而言,Bug远远没有到达上述那种高深的地步,架构有架构师!程序员往往只需要保证我们自己的那一亩三分田地的代码是OK的!不管业务需求,不管风吹雨打!有的程序员每天都在push代码,可是正儿八斤高效的代码极其少,有的程序员甚至可笑的说,我怎么着也是写过xx万行代码的大牛!笑而不语。
在我看来,高效代码就是结合需求在不断的压力测试中慢慢改进,这样的代码才是优秀代码!还有一个就是判断一个程序员是否算是程序员的时候,就应该问他解决过的Bug,以及解决Bug的途径!没错,调试工具这里就显得很重要~ 一个好的程序员必是一个好的调试工程师!同样的问题,好的程序员往往10分钟就能搞定,而Low的程序员只会说:”这不可能啊、我的代码没问题啊、见鬼了、我的代码肯定没问题”之类的话!
KDB做为一款内核级别的调试器,对于内核程序员 && 驱动程序员的帮助非常大,KDB的主要优点包括它允许进行内存地址和寄存器修改,并且可以设置堆栈,我本人最喜欢的一个功能就是反汇编了。关于KDB一些使用心得我也会在后续慢慢写出来!
打开宏
b.内存操作命令
第一个参数为地址显示行数(缺省为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.堆栈操作命令
d.断点操作命令
e.系统命令&&寄存器操作
f.反汇编命令
有. CTRL + Break..
2、
By: Keven - 点滴积累
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 | 单步调试,执行到分支或者函数调用时停止,结合断点使用 |
命令 | 参数 | 示例 | 备注 |
---|---|---|---|
md | vaddr [line-count [output-radix]] | md 0xffffffffbfc00400 1 16 | 显示内存内容,如果不指定参数,将使用缺省! |
第二个参数是以几进制显示,支持的有(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 | 显示所有进程的堆栈调用 |
命令 | 参数 | 示例 | 备注 |
---|---|---|---|
bp | vaddr | bt 0xffffffffbfc00400 | 设置断点,直接输入bp可显示断点 |
bl | vaddr | bl | 显示断点 |
bc | bpnum | bc 0 | bc * 清除断点#0,*表示清除所有的断点 |
bd | bpnum | bd 0 | 使断点#0无效 |
be | bpnum | be 0 | 激活断点#0 |
命令 | 参数 | 示例 | 备注 |
---|---|---|---|
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 | 显示异常帧 |
命令 | 参数 | 示例 | 备注 |
---|---|---|---|
id | vaddr | id 0xffffffffc0267cd8 | 反汇编当前地址 |
4、调试小技巧
5、Q & A
1、有没有键盘快捷键可以直接进入KDB?有. CTRL + Break..
2、
By: Keven - 点滴积累
相关文章推荐
- Java基础06 组合
- [GDKOI模拟2016.02.16]苹果树
- hdu 1097 A hard puzzle
- mysql数据库设置自增id初始值
- QuickFIX/N 动态存储配置信息
- 20160130.CCPP体系详解(0009天)
- 20160130.CCPP体系详解(0009天)
- 编程题#4:计算整数平方和(C++程序设计第10周)
- 数组
- 重温 Win32 API ----- 截屏指定窗体并打印
- Codeforces 622B The Time 【水题】
- 20160129.CCPP体系详解(0008天)
- 20160129.CCPP体系详解(0008天)
- (java) Search a 2D Matrix
- 2 Types of Linux File Locking (Advisory, Mandatory Lock Examples)
- C语言函数
- 华为机试题:字符转换Univesity
- Java基础05 实施接口
- 解密伪科学-碧波庭
- linux常用命令