kgdb源代码分析(2.6.27)
本文由penny编写, 你可以通过发邮件到[email protected]联系penny,
也可以直接评论本文章与penny交流.
0. 概述
1. 异步通知
2. 准备工作
3.gdb 远程串行协议(GDB remote serial protocol)
4. 命令实现:
4.1 断点.
4.2 continue 和 step
5 初始化时机.
0. 概述
前段时间用 KGDB 调了一下内核,感觉这个东西还不错,不过更令人感兴趣的是它的工作
原理. 内核运行得好好的,那么多线程在好几个 cpu 上面跑,就是因为踩到一个断点,它就
把所有东西都放下来让 gdb来调,kgdb 是怎样办到的?
本文是本人看 kgdb 的代码的一些记录,如有错误的地方敬请指出.
一般软件调试的原理是,调试器根据目标文件的调试信息找到源码和机器码之间的映射
关系,并把它关心的指令替换成一条断点指令,x86 对应的就是 asm("int $3"),它的二进制代
码是 0xcc.当程序执行到这个地方时断点指令被执行,程序被中断,调试器接管它的控制权,
这时可以查看内存信息甚至修改内存.当调试器完成任务后把断点指令替换回原来的指令,
并把 pc 寄存器减一,让 cpu 从被中断的那条指令开始执行.这样程序可以在没有影响执行的
情况下被调试.
调试内核也离不开一般原理,只不过内核不同一般程序,不能单靠同一台机的 gdb 来完成.
要依靠 kgdb,它是内核里面的一小段程序,它可以和另外一台机器上的 gdb 进行通信,可以执行
gdb 过来的一些命令并返回信息,完成调试过程.
关于kgdb的配置,网上有很多,而且非常详细,这里就不重复了.
本文的内容:
1.从内核是怎样把控制权交给 kgdb 的开始,到
2.kgdb 的入口函数,看 kgdb 怎样处理竞态,再了解
3.kgdb 和 gdb 之间的通信协议,接着是
4.kgdb 对具体命令的执行,最后再看看
5.kgdb 是在什么时候被启动的.
内核版本是 2.6.27.
[…] 0. 概述 1. 异步通知 2. 准备工作 3.gdb 远程串行协议(GDB remote serial protocol) 4. 命令实现: 4.1 断点. 4.2 continue 和 step 5 初始化时机. […]
[…] 0. 概述 1. 异步通知 2. 准备工作 3.gdb 远程串行协议(GDB remote serial protocol) 4. 命令实现: 4.1 断点. 4.2 continue 和 step 5 初始化时机. […]
[…] 0. 概述 1. 异步通知 2. 准备工作 3.gdb 远程串行协议(GDB remote serial protocol) 4. 命令实现: 4.1 断点. 4.2 continue 和 step 5 初始化时机. […]
[…] 0. 概述 1. 异步通知 2. 准备工作 3.gdb 远程串行协议(GDB remote serial protocol) 4. 命令实现: 4.1 断点. 4.2 continue 和 step 5 初始化时机. […]
[…] 0. 概述 1. 异步通知 2. 准备工作 3.gdb 远程串行协议(GDB remote serial protocol) 4. 命令实现: 4.1 断点. 4.2 continue 和 step 5 初始化时机. […]
[…] 0. 概述 1. 异步通知 2. 准备工作 3.gdb 远程串行协议(GDB remote serial protocol) 4. 命令实现: 4.1 断点. 4.2 continue 和 step 5 初始化时机. […]
dddddddd
[回复]
您好,我想问一下,你们分析kgdb代码的时候,是怎么分析的呢?那可以调试kgdb的代码吗?可以直接在kgdb的关键函数处设置断点吗?我是vmware里用qemu里跑了linux3.2内核,在kgdb的一些关键函数处打断点,为什么都停不下来呢?
[回复]
DDD 回复:
三月 6th, 2012 at 9:50 下午
@pc8504 调试kgdb,只能用最原始的方法(如果没有硬件调试器的话),在有些地方也可以用printk,但会影响判断,大部分情况下只能看现象和分析。
即如果系统不死掉,并能正常调试,测试通过就表明当前代码在当前状态下是正常的。。。
[回复]