我编译了自己的内核模块,现在我希望能够加载它 进入GNU Debugger GDB。我做了一次,一年前左右看看 在内存布局。它工作得很好,但当然我太傻了 写下我为实现这一目标而采取的单一步骤......任何人都可以启发 我还是指点一个好的教程?
非常感谢
答案 0 :(得分:3)
对于内核> 2.6.26(即2008年5月之后),首选方法可能是使用“kgdb light”(不要与其祖先kgdb混淆,可作为一组内核补丁使用)。 “kgdb light”现在是内核的一部分(例如默认情况下在当前的Ubuntu内核中),并且它的功能正在快速提升(Jason Wessel正在研究它 - 可能是谷歌密钥)。
缺点:你需要两台机器,你正在调试的机器和运行gdb的开发机器(主机)。目前,这两台机器只能通过串行链接进行链接。 kgdb在目标机器中运行,它处理断点,步进等,远程调试协议用于与开发机器通信。 gdb在处理用户界面的开发机器中运行。 USB转串口适配器在开发机器上工作正常,但目前,您需要在目标机器上安装一个真正的UART - 而且在最近的硬件上不再那么频繁。
(简洁)kgdb文档位于内核源代码中 文档/ DocBook的
我建议你谷歌四处寻找“kgdb light”的完整故事。 再次,不要混淆kgdb和kgdb光,它们在谷歌搜索中聚集在一起,但大多是不同的动物。特别是,来自linsyssoft.com的信息与“祖先”kgdb有关,因此请尝试查询:
kgdb module debugging -"linsyssoft.com" -site:linsyssoft.com
并在2008年5月/ 2.6.26内核之前丢弃文章。 最后,对于模块调试,您需要在开发机器中手动加载您感兴趣的所有代码和部分的模块符号。这里有点太长了,但是有一些线索there,{{3 }和there 最重要的是,kgdb是一个非常受欢迎的改进,但不要指望这次旅行就像在用户模式下运行gdb一样简单。然而。 :)
答案 1 :(得分:2)
自从我积极开发Linux驱动程序以来已经有一段时间了,所以也许我的答案有点过时了。我会说你不能使用GDB。如果有的话,只调试转储文件上的post mortem。要调试你应该使用内核调试器。在启用内核调试器的情况下构建内核(2.6有一个开箱即用的调试器,在我活动时缺少这个调试器)。我使用了来自Sun ftp://oss.sgi.com/www/projects/kdb/download/的KDB内核补丁,我非常满意。除非新的gdb以某种方式与内部内核调试器通信(无论如何你必须激活),否则用户空间工具将没有多大用处。
我希望这至少会给你一些提示,而不是一个详细的答案。总比没有答案好。问候。
答案 2 :(得分:1)
我怀疑你做的是
gdb /boot/vmlinux /proc/kcore
当然你实际上无法进行任何调试,但它肯定足以让你在内核周围进行调整。