许多读者可能奇怪为什么内核没有建立更多高级的调试特性在里面.答案, 非常简单, 是 Linus 不相信交互式的调试器. 他担心它们会导致不好的修改, 这些修改给问题打了补丁 而不是找到问题的真正原因. 因此, 没有内嵌的调试器.
其他内核开发者, 但是, 见到了交互式调试工具的一个临时使用. 一个这样的工具是 kdb 内嵌式内核调试器, 作为来自 的一个非官方补丁. 要使用 kdb, 你必须获 得这个补丁(确认获得一个匹配你的内核版本的版本), 应用它, 重建并重安装内核. 注意, 直到本书编写时, kdb 只在 IA-32(x86)系统中运行(尽管一个给 IA-64 的版本在主线内核 版本存在了一阵子, 在被去除之前.)
一旦你运行一个使能了 kdb 的内核, 有几个方法进入调试器. 在控制台上按下 Pause(或 者 Break) 键启动调试器. kdb 在一个内核 oops 发生时或者命中一个断点时也启动, 在 任何一种情况下, 你看到象这样的一个消息:
Entering kdb (0xc0347b80) on processor 0 due to Keyboard Entry [0]kdb>
注意, 在 kdb 运行时内核停止任何东西. 在你调用 kdb 的系统中不应当运行其他东西; 特别, 你不应当打开网络 -- 除非, 当然, 你在调试一个网络驱动. 一般地以单用户模式 启动系统是一个好主意, 如果你将使用 kdb.
作为一个例子, 考虑一个快速 scull 调试会话. 假设驱动已经加载, 我们可以这样告诉 kdb 在 sucll_read 中设置一个断点:
[0]kdb> bp scull_read
Instruction(i) BP #0 at 0xcd087c5dc (scull_read) is enabled globally adjust 1
[0]kdb> go
bp 命令告诉 kdb 在下一次内核进入 scull_read 时停止. 你接着键入 go 来继续执行. 在将一些东西放入一个 scull 设备后, 我们可以试着通过在另一个终端的外壳下运行 cat 命令来读取它, 产生下面:
Instruction(i) breakpoint #0 at 0xd087c5dc (adjusted) 0xd087c5dc scull_read: int3
Entering kdb (current=0xcf09f890, pid 1575) on processor 0 due to
如果觉得《linux kdb内核调试器 linux kdb 内核调试器》对你有帮助,请点赞、收藏,并留下你的观点哦!