首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux 内核调试器内幕 KDB 入门指南--KDB 命令

Linux 内核调试器内幕 KDB 入门指南--KDB 命令

KDB 是一个功能非常强大的工具,它允许进行几个操作,比如内存和寄存器修改、应用断点和堆栈跟踪。根据这些,可以将 KDB 命令分成几个类别。下面是有关每一类中最常用命令的详细信息。
内存显示和修改这一类别中最常用的命令是         md 、         mdr 、         mm 和         mmW 。      
md 命令以一个地址/符号和行计数为参数,显示从该地址开始的         line-count 行的内存。如果没有指定         line-count ,那么就使用环境变量所指定的缺省值。如果没有指定地址,那么         md 就从上一次打印的地址继续。地址打印在开头,字符转换打印在结尾。      
mdr 命令带有地址/符号以及字节计数,显示从指定的地址开始的         byte-count 字节数的初始内存内容。它本质上和         md 一样,但是它不显示起始地址并且不在结尾显示字符转换。         mdr 命令较少使用。      
mm 命令修改内存内容。它以地址/符号和新内容作为参数,用         new-contents 替换地址处的内容。      
mmW 命令更改从地址开始的         W 个字节。请注意,         mm 更改一个机器字。      
示例
显示从 0xc000000 开始的 15 行内存:
1
[0]kdb> md 0xc000000 15




将内存位置为 0xc000000 上的内容更改为 0x10:
1
[0]kdb> mm 0xc000000 0x10




寄存器显示和修改这一类别中的命令有         rd 、         rm 和         ef 。      
rd 命令(不带任何参数)显示处理器寄存器的内容。它可以有选择地带三个参数。如果传递了         c 参数,则         rd 显示处理器的控制寄存器;如果带有         d 参数,那么它就显示调试寄存器;如果带有         u 参数,则显示上一次进入内核的当前任务的寄存器组。      
rm 命令修改寄存器的内容。它以寄存器名称和         new-contents 作为参数,用         new-contents 修改寄存器。寄存器名称与特定的体系结构有关。目前,不能修改控制寄存器。      
ef 命令以一个地址作为参数,它显示指定地址处的异常帧。      
示例
显示通用寄存器组:
1
[0]kdb> rd




1
[0]kdb> rm %ebx 0x25




断点常用的断点命令有         bp 、         bc 、         bd 、         be 和         bl 。      
bp 命令以一个地址/符号作为参数,它在地址处应用断点。当遇到该断点时则停止执行并将控制权交予 KDB。该命令有几个有用的变体。         bpa 命令对 SMP 系统中的所有处理器应用断点。         bph 命令强制在支持硬件寄存器的系统上使用它。         bpha 命令类似于         bpa 命令,差别在于它强制使用硬件寄存器。      
bd 命令禁用特殊断点。它接收断点号作为参数。该命令不是从断点表中除去断点,而只是禁用它。断点号从 0 开始,根据可用性顺序分配给断点。      
be 命令启用断点。该命令的参数也是断点号。      
bl 命令列出当前的断点集。它包含了启用的和禁用的断点。      
bc 命令从断点表中除去断点。它以具体的断点号或         * 作为参数,在后一种情况下它将除去所有断点。      
对函数           sys_write() 设置断点:        
示例
1
[0]kdb> bp sys_write




列出断点表中的所有断点:
1
[0]kdb> bl




清除断点号 1:
1
[0]kdb> bc 1




>堆栈跟踪主要的堆栈跟踪命令有         bt 、         btp 、         btc 和         bta 。      
bt 命令设法提供有关当前线程的堆栈的信息。它可以有选择地将堆栈帧地址作为参数。如果没有提供地址,那么它采用当前寄存器来回溯堆栈。否则,它假定所提供的地址是有效的堆栈帧起始地址并设法进行回溯。如果内核编译期间设置了         CONFIG_FRAME_POINTER 选项,那么就用帧指针寄存器来维护堆栈,从而就可以正确地执行堆栈回溯。如果没有设置         CONFIG_FRAME_POINTER ,那么         bt 命令可能会产生错误的结果。      
btp 命令将进程标识作为参数,并对这个特定进程进行堆栈回溯。      
btc 命令对每个活动 CPU 上正在运行的进程执行堆栈回溯。它从第一个活动 CPU 开始执行         bt ,然后切换到下一个活动 CPU,以此类推。      
bta 命令对处于某种特定状态的所有进程执行回溯。若不带任何参数,它就对所有进程执行回溯。可以有选择地将各种参数传递给该命令。将根据参数处理处于特定状态的进程。选项以及相应的状态如下:      
  • D:不可中断状态
  • R:正运行
  • S:可中断休眠
  • T:已跟踪或已停止
  • Z:僵死
  • U:不可运行
这类命令中的每一个都会打印出一大堆信息。请查阅下面的 以获取这些字段的详细文档。      
示例
跟踪当前活动线程的堆栈:
1
[0]kdb> bt




跟踪标识为 575 的进程的堆栈:
1
[0]kdb> btp 575




其它命令下面是在内核调试过程中非常有用的其它几个 KDB 命令。
id 命令以一个地址/符号作为参数,它对从该地址开始的指令进行反汇编。环境变量         IDCOUNT 确定要显示多少行输出。      
ss 命令单步执行指令然后将控制返回给 KDB。该指令的一个变体是         ssb ,它执行从当前指令指针地址开始的指令(在屏幕上打印指令),直到它遇到将引起分支转移的指令为止。分支转移指令的典型示例有         call 、         return 和         jump 。      
go 命令让系统继续正常执行。一直执行到遇到断点为止(如果已应用了一个断点的话)。      
reboot 命令立刻重新引导系统。它并没有彻底关闭系统,因此结果是不可预测的。      
ll 命令以地址、偏移量和另一个 KDB 命令作为参数。它对链表中的每个元素反复执行作为参数的这个命令。所执行的命令以列表中当前元素的地址作为参数。      
示例
反汇编从例程 schedule 开始的指令。所显示的行数取决于环境变量         IDCOUNT :      
1
[0]kdb> id schedule




执行指令直到它遇到分支转移条件(在本例中为指令         jne )为止:      
1
2
3
4
5
6
7
8
9
[0]kdb> ssb
        <br><br>
0xc0105355  default_idle+0x25:  cli
        <br>
0xc0105356  default_idle+0x26:  mov  0x14(%edx),%eax
        <br>
0xc0105359  default_idle+0x29:  test %eax, %eax
        <br>
0xc010535b  default_idle+0x2b:  jne  0xc0105361 default_idle+0x31

返回列表