首先kdb不是Linux内核的标准配置,需要先到这个网站上去下载补丁
ftp://oss.sgi.com/www/projects/kdb/download/v4.4/

以2.6.28为例,下载
kdb-v4.4-2.6.28-common-1.bz2
kdb-v4.4-2.6.28-x86-1.bz2

  • v4.4是KDB的版本号
  • 2.6.28是Linux内核的版本号
  • common是通用patch,必须下载
  • ia64和x86根据自己的体系结构,选择一种下载
  • 最后的-1表示有多个同样的patch,选择数目最大的下载

注意不要下载带rc字样的,我试过,打补丁的时候总是有fail出现。

然后下载一个纯的linux内核源码文件,记住,一定要是纯的linux内核源码,不能是什么redhat等等公司出的版本。否则在pacth时就会出现error了。

2
按照/usr/src/linux/Documentation/kdb/slides中的官方文档
解压源代码到/usr/srv/linux-2.6.28
bunzip2解压两个补丁文件,放到/usr/srv/linux-2.6.28中,
用patch -p 1 -N -u -i 补丁名
打上两个补丁
这一步要看清楚,输出中不能有任何fail或reject,若有,检查是否补丁是否出错(再次提醒不要下带rc字样的),或者不是纯的内核。

3
sudo make menuconfig,设置内核编译选项
确保.config文件选项有如下:
CONFIG_KDB=y
CONFIG_KDB_MODULES=n
CONFIG_KDB_OFF=n
CONFIG_KDB_CONTINUE_CATASTROPHIC=0
CONFIG_KDB_USB=y
CONFIG_KDB_KDUMP=y
CONFIG_KALLSYMS=y
CONFIG_FRAME_POINTER=y
不能急于编译!不然编译过程中会出现(血的教训啊~)
kdba_support.c:53: undefined reference to `halt_current_cpu’
因为
alt_current_cpu函数定义在/usr/src/linux/arch/x86/kernel/crash.c中
而这个函数定义前面有

if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC)

static atomic_t waiting_for_crash_ipi;

所以再在.config文件中手工加入
CONFIG_SMP=y
CONFIG_X86_LOCAL_APIC=y
即可解决

然后编译内核,完成。

4
要控制KDB,可以通过grub
kdb=on 开启kdb
kdb=off 关闭kdb
kdb=early 刚进入系统时就暂停并进入kdb
kdb=on-nokey 任何键盘按键都不能触发kdb

或者通过proc(注意,要用root权限)
echo ‘0’ > /proc/sys/kernel/kdb 关闭kdb
echo ‘1’ > /proc/sys/kernel/kdb 开启kdb
echo ‘2’ > /proc/sys/kernel/kdb 任何键盘按键都不能触发kdb

例如
echo “1” > /proc/sys/kernel/kdb 回车以后没什么反映,说明启动成功了。
如果运行这个命令以后,提示找不到kdb这个文件,说明kdb根本就没安装成功。
可以cat /proc/sys/kernel/kdb
查看结果。

5
然后到这一步,所有的书上和网上都说到以按下 pause键就进入kdb了,OK,我按下pause键, cap lock确实开始狂闪了,然后再按什么键鼠标都没反应了,恭喜你,死机了,按点源重启吧,momo。

我不知道写那些什么kdb使用的文章的人是不是都是绝顶聪明不会遇到这种情况,反正我是没有在网上找到任何关于这个问题的答案。

翻来覆去的看《linux设备驱动程序3》,终于在kdb一节中发现一段话:

Note that just about everything the kernel does stops when kdb is running. Nothing
else should be running on a system where you invoke kdb; in particular, you should
not have networking turned on—unless, of course, you are debugging a network
driver. It is generally a good idea to boot the system in single-user mode if you will be
using kdb.

翻译:”注意, 在kdb运行时内核停止任何东西. 在你调用 kdb 的系统中不应当运行其他东西; 特别, 你不应当打开网络 – 除非, 你在调试一个网络驱动. 一般地以单用户模式启动系统是一个好主意。”

所 以我们要在单用户模式下用kdb!首先我们先为root设个密码,su root,设好后,sudo init 1进入单用户模式,然后选取下面那个root Drop to root shell prompt,然后输入root的密码,现在进入纯命令行界面,按下pause,呵呵,你看到了什么。

以后系统oops时也会自动进入kdb,所有你最好保证你编写的驱动没有问题了,再在正常模式下测试,一般先在单用户模式下测试好再说。

退出kdb输入Go+回到单用户模式命令行,注意千万不要输入startx,那样你还是在单用户模式下,很多模块没加载,保证你一进桌面就死机,正确的做法是ctrl+d,然后选择第1个resume重新回到登录窗口。

5
kdb的基本用法,这个全部是转的,记住常用的即可。
   安装新内核后,使用新内核重新启动机器,现在,内核已经有kdb支持了。那么如何进入调试环境呢?如果在配置内核时,没有选择kdb-off by default,那么在内核启动后,按下“pause”键即可进入kdb调试环境。如果在配置内核时选择了kdb-off by default,那么有两种办法:一种是在启动时加入“kdb=on”,另一种方式是在proc文件系统加载后,输入如下命令:
  #echo 1”>/proc/sys/kernel/kdb。
  然后就可以按“pause”键进入调试环境了。按“pause”键后,出现提示符kdb,同时键盘上Caps和Scroll两指示灯不停闪烁,提示现在处于kdb调试环境中。
  kdb提供丰富的命令实现运行控制、内存操纵、寄存器操纵、断点设置、堆栈跟踪等许多功能,总共有33条命令,下面分别进行介绍。
  运行控制类
  包括go、ss和ssb三个命令,提供对程序执行的控制。具体用法如下:
  go:继续程序执行
  格式:go
  该命令使内核继续执行,直到遇到一个断点才停止。如果没有设置断点,该命令将离开kdb调试器,系统回到正常运行状态。Caps和Scroll指示灯恢复到原来的状态。
  ss:单步执行程序
  格式:ss
  该命令仅仅执行下一条指令,执行完后停止。这在进行跟踪时是必不可少的。
  ssb:执行到分支或者函数调用时停止
  格式:ssb
  该命令与ss的区别是,ss只执行一条语句,而ssb执行一组语句,它使指令继续执行,在遇到一个分支语句,或者遇到一个函数调用语句时停止。
  断点类
  kdb提供强大的断点功能,包括设置断点、清除断点、激活断点、使断点失效,kdb也可以设置硬件断点。断点指令包括bp、bl、bpa、bph、bpha、bc、be和bd。
  bp:设置或者显示断点
  格式:bp []
  该命令设置一个新的断点,其中vaddr是要设置的断点的地址。如果不带参数,运行bp将显示当前设置的所有断点。
  bl:设置或者显示断点
  格式:bl []
  该命令的操作与bp命令相同。
  bpa:设置或者显示全局断点
  格式:bpa []
  该命令设置一个全局断点,或者显示所有全局断点,用法同上。
  bph:设置硬件断点或者显示所有断点
  格式:bph [vaddr [datar|dataw|io [length]]]
  如果不带参数,则显示所有断点。如果带参数,那么设置断点。其中vaddr为要设置硬件断点的地址,datar表示对该内存区进行读操作,dataw表示写操作,io表示对该内存区进行io输入输出操作。length指明读写io操作的数据长度。
  bpha:设置硬件断点或者显示所有断点
  格式和用法同bph。
  bc:清除断点
  格式:bc
  清除标号为bpnum的断点。如果断点号为“*”,将清除所有断点。
  bd:使断点无效
  格式:bd
  使标号为bpnum的断点无效,如果标号为“*”,表示使所有断点无效。
  be:激活断点
  格式:be
  激活标号为bpnum的断点。如果标号为“*”,将激活所有无效的断点。
  内存操作类
  内存操作类命令包括对内存进行显示和修改的md、mdr、mds、mm四条命令。
  md:显示内存内容
  格式1:md [vaddr [line-count [output-radix]] ]
   显示地址为vaddr的内存的内容。line-count为要显示的内存的行数,output-radix指定以8进制、10进制或者16进制显示。如 果省略line-count和output-radix,那么将以设置的环境变量MDCOUNT和RADIX方式显示。如果不带任何参数,md命令将接着 上次md命令的后续地址显示内存内容
格式2:mdWcn
  在缺省情况下,md以当前环境变量BYTESPERWORD的值读取数据,在读取硬件寄存器的时候,需要指定数据的宽度。这是可以使用mdWcn来进行读取,W是读取的宽度,单位是字节,cn为要读取的数目。
  mdr:显示原始内存的内容
  格式:mdr
  从指定地址vaddr开始显示count长度的内存,它打印一连串的内存数据。这个命令是留给外部的调试器使用的,一般很少使用。
  mds:以符号的方式显示内存的内容
  格式:mds [vaddr [line-count [output-radix]]]
  从指定地址vaddr开始显示内存的内容,与md的区别是每行仅显示一个字,并且它试图将该地址与符号表进行匹配,如果找到,那么它将显示相应的符号名以及偏移值。如果不带参数,它将从上次mds的末尾开始显示。
  mm:修改内存内容
  格式1:mm
  将指定地址vaddr开始的数据修改为新的数据。修改的数据的长度为一个机器字。
  格式2:mmW
  意义同上,区别在于它改变W字节的内容。
  堆栈跟踪类
  该类指令实现对堆栈的跟踪,包括bt、btp和bta三条命令。
  bt:显示调用堆栈
  格式:bt []
  如果不指定参数,它根据当前寄存器的内容显示堆栈,提供当前活动线程的完整的堆栈跟踪。如果指定stack-frame addr参数,它将从该地址开始跟踪。
  btp:显示进程的堆栈
  格式:btp
  显示由pid指定的进程的堆栈。
  bta:显示所有进程的堆栈
  格式:bta
  寄存器类
  寄存器类命令包括对寄存器内容进行显示和修改的rd和rm指令,以及异常帧显示指令ef。
  rd:显示寄存器内容
  格式:rd [c|d|u]
   如果不带任何参数,rd显示所有进入kdb调试器时该点所设置的所有通用寄存器的值。如果带c参数,它将显示控制寄存器cr0、cr1、cr2、cr4 寄存器的内容。如果带d参数,它显示调试寄存器的内容。如果带u参数,它显示当进入kdb调试器时当前任务的所有寄存器。
  rm:修改寄存器的内容
  格式:rm
   该命令修改register-name指定的寄存器的内容为register-content。其中register-name 为%eax、%ebx、%ecx、%edx、%esi、%edi、%esp、%eip或%ebp。如果参数为%%,由rd u指定的寄存器将被修改。当前rm命令不允许修改控制寄存器,也不允许显示和修改Pentium和Pentium Pro系列的特定寄存器。
  ef:显示异常帧
  格式: ef
  显示vaddr地址处的异常帧。
  环境变量类
  这类指令对kdb调试器环境变量进行显示和设置。包括set和env命令。
  set:设置环境变量
  格式:set

kdb 使用手册指导 1相关推荐

  1. MOS管手册指导文档

    MOS管手册指导文档 查询厂商网站 应用场景 N沟道 P沟道 手册数据 绝对最大额定参数![在这里插入图片描述](https://img-blog.csdnimg.cn/31b7acde2eea48b ...

  2. 计算机系老师带教记录册,毕业论文指导手册指导老师指导记录.docx

    2019年毕业论文指导手册指导老师指导记录 毕业论文指导手册指导老师指导记录 ? 说明:指导老师指导记录总共6次,请各位同学按照法学院网站上公布的毕业论文写作进度确定每次指导记录的时间.同时根据自己的 ...

  3. DJYOS驱动开发系列三:基于DJYOS的SPI驱动编写指导手册

    1.贡献者列表 深圳市秦简计算机系统有限公司DJYOS驱动开发团队. 2.概述 DJYOS的DjyBus总线模型为IIC.SPI之类的器件提供统一的访问接口,SPIBUS模块是DjyBus模块的一个子 ...

  4. CoreOS的Tectonic新发行版支持Kubernetes自我管理

    本文讲的是CoreOS的Tectonic新发行版支持Kubernetes自我管理[编者的话]本文详细介绍了CoreOS Tectonic(商业版Kuberbetes)新发型版中的self-hostin ...

  5. web人力资源信息系统开发日志②

    第二阶段开发(2017年4月28日-5月20日): 开发内容:①项目框架设计.目录树形结构.数据库设计②编写Web Apps安装程序,检测运行环境.创建数据源及数据库用户信息并生成PDO配置文件(接口 ...

  6. masm5安装教程_汇编语言程序环境搭建masm+debug64位 win10/7

    介绍:MASM是Microsoft Macro Assembler 的缩写,是微软公司为x86 微处理器家族开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译 ...

  7. linux使用jinja2模板_linux下安装python组件之jinja2

    这是本人在工作中的随笔,如有错误之处,还请指正! 首先说一下什么是jinja2 Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强 ...

  8. P6 EPPM 16.1 安装和配置指南 1

    安装和配置指南 下一topiccontents 这些指南解释如何安装和配置数据库服务器,和P6 EPPM,模块:他们还提供在P6 EPPM能够解决所有模块的概述. 标准指南帮助您配置和部署应用程序向导 ...

  9. 从0到1000万:哔哩哔哩直播架构演进史

    本期作者 赵海林 B端技术中心资深开发工程师 01 前言 哔哩哔哩直播成立于 2014 年,经过 8 年时间的发展已经从最初的业务试水成长为公司重要的业务板块之一.技术架构也从一个单体服务演进为由数百 ...

最新文章

  1. JavaScript的编译模式
  2. Python读写文件 - 转
  3. Dubbo和Zookeeper
  4. 滚动条——WPF ScrollViewer的应用
  5. shell把字符串中的字母去掉,只保留数字
  6. EMC NetWorker恢复oracle指南
  7. java中List与Map的使用
  8. No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? ide
  9. Linux学习总结(73)——Linux高频命令大总结
  10. 转:Real6410 Linux 常见问题总结(截至2010/07/26)
  11. 关于Java浮点数运算精度丢失问题
  12. 怎么用计算机测出来体脂,怎么测体脂比较科学
  13. 要点初见:安装教程与二度拓展——基于SUMO的Flow Project(附代码链接)
  14. 印度电影,又一次让我们不得不服
  15. C++游戏《Flappy bird》
  16. anchor译中文_anchor是什么意思中文翻译
  17. windows7自带摄像头拍照摄像软件
  18. iOS 判断系统版本
  19. 数据结构编程实践(七)创建哈夫曼树、生成哈夫曼编码、完成图片的压缩与解压缩
  20. 第二章——单链表和循环单链表

热门文章

  1. ubuntu下依靠guvcview使用摄像头
  2. M1芯片已适配Final Cut Pro X苹果M1处理器安装新版FCPX教程 适配M1芯片的Mac电脑Final Cut Pro更新版本10.5
  3. ip地址中斜杠(/)含义
  4. 南京邮电大学CTF-密码学-骚年来一发吗
  5. 电力系统暂态稳定仿真/simulink仿真 simulink搭建单机无穷大系统进行暂态稳定性仿真
  6. 已解决:MySQL Workbench 8.0 CE进行汉化。
  7. EZDML批量生成spring-boot jpa swagger2 lombok后端接口
  8. golang slice扩容
  9. 零起点学VB做外挂(五)
  10. 汽车电子 CCP学习