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 - 点滴积累

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

  1. [uboot] (番外篇)uboot之fdt介绍

    以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例 [uboot] uboot流程系列: [project X] tiny210(s5pv210)上电启动流程( ...

  2. 【转】动态模型及其求解介绍–番外篇

    上一篇文章(中篇)里 面,我用的示意图是因子图,而里面也出现了Psi函数,本来应该当时就解释清楚的,但实在没有精力写那么多东西,所以就想放到下篇讲的.后来发现,讲条件 随机场要结合有向无向图和inde ...

  3. iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook(转载)

    作者简介:郑旻(花名蒸米),阿里巴巴移动安全部门资深安全工程师,香港中文大学移动安全(Android & iOS)方向博士,曾在腾讯.百度以及硅谷的FireEye实习.在博士期间发表了多篇移动 ...

  4. iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook

    作者简介:郑旻(花名蒸米),阿里巴巴移动安全部门资深安全工程师,香港中文大学移动安全(Android & iOS)方向博士,曾在腾讯.百度以及硅谷的FireEye实习.在博士期间发表了多篇移动 ...

  5. 浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)

    前言   去年在看雪论坛写了一篇<浅析android手游lua脚本的加密与解密>的精华文章,今年写一篇番外篇,将一些lua反编译对抗的内容整合一起,并以3个实例作为说明(包括2018腾讯游 ...

  6. 你所能用到的数据结构之番外篇---逆袭的面向对象(一)

    对于番外篇,我深刻能明白在大多数人眼里就和电视剧的广告一样,说实话,我也不喜欢这种感觉,因为这样会让人觉得是在欺骗消费者啊~~~阿西巴~~~但是我实在发现如果不在这里对面向对象来个入门级的介绍,后面的 ...

  7. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    转载自:https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程:给深度学习入门者的Python快速教程 - 基础篇 给深度学习入门者的Python快速教程 - ...

  9. 【梅哥的Ring0湿润插入教程】【番外篇四】抓取盛大GPK驱动保护文件及简略逆向...

    [梅哥的Ring0湿润插入教程] Email:mlkui@163.com 转载请注明出处,谢绝喷子记者等,如引起各类不适请自觉滚J8蛋! 番外篇四:抓取盛大GPK驱动保护文件及简略逆向 [湿润前言] ...

最新文章

  1. Single Shot Multibox Detection (SSD)实战(上)
  2. linux node 文件存放目录_Linux文件与目录结构
  3. 版本变迁_一本书遍览古今中外红楼梦版本变迁
  4. 看雪学院课程《汇编语言详解与二进制漏洞初阶》笔记
  5. CVPR 2016 SINT:《Siamese Instance Search for Tracking》论文笔记
  6. SpringBoot 中 @RequestBody的正确使用方法
  7. pip指定源安装_几种python安装简单方法
  8. 网络流量统计using ADB
  9. 【分享】北漂五年,创业、字节、和阿里,现在回家
  10. 单细胞测序流程(二)数据整理
  11. CDN:BootCDN
  12. 2022Mothercup建模比赛
  13. 还在使用BeanUtils.copyProperties()? 来看看MapStruct,强大五倍
  14. shp、tif文件坐标系转换
  15. Python异步: 什么时候使用异步?(3)
  16. 第7章 分析恶意的windows程序
  17. 创建新Docker容器时出现“The container name “/xxx“ is already in use by container xxxxxxxxxxx...”问题的解决办法
  18. java导出csv小程序_微信小程序——使用excel-export导出excel
  19. 暴风播酷云二期J3455 DS918 1.04b引导6.23完美群晖教程,可硬洗,正常开关机、WOL
  20. 计算机没有开启还原的功能,怎么打开电脑的系统还原功能

热门文章

  1. Java阻塞队列-BlockingQueue介绍及实现原理
  2. Linux 【权限,粘滞位】
  3. IOS 应用内支付(IAP)接口使用说明
  4. SAP中KKS5/KKS6事务计算投入产生差异逻辑
  5. Android 短信验证 SDK 接入(Mob SMSSDK)
  6. Aspose.Cells - 在任何平台上操作Excel电子表格
  7. zabbix邮件报警接入,微信报警接入
  8. 神奇的人工智能之神笔马良|Stable Diffusion使用
  9. 更自然的解决字典数组插入nil而导致crash
  10. 《初等数论》:最大公因数与最小公倍数