25-小结
14.6 小结
- Linux内核的调试非常复杂,特别是在交叉开发环境中。理清这些复杂的关系是成功进行内核调试的关键。
- KGDB是一个非常有用的内核级GDB stub,借助它我们能够直接在内核和设备驱动程序中进行带符号的源码级调试。它使用GDB远程协议与主机上的交叉gdb进行通信。
- 当单步跟踪优化代码时,你会碰到一些看似奇怪的调试器行为,理解(和最小化)编译器的优化级别能够帮助你分析其中的原因。
- GDB支持用户自定义命令,这对GDB自动完成一些繁琐的调试任务有极大帮助,比如遍历内核中的链表和访问复杂的变量。
- 内核可加载模块给源码级调试带来一些特有的挑战。为了调试模块的初始化函数,你可以在module.c中调用
mod->init()
的地方设置一个断点。 - printk和Magic SysReq key工具有助于定位内核开发和调试的过程中出现的问题。
- 利用JTAG探测器进行的硬件辅助调试能够调试驻留在闪存或只读存储器中的代码,而其他调试方法可能很麻烦或根本不可能调试这类代码。
- 在移植新的内核时,如果目标架构支持
CONFIG_EARLY_PRINTK
,那么开启这个选项会成为一个强大的调试工具。 - 通过查看
printk
的日志缓冲区往往可以定位内核引导时出现崩溃的原因。 - 在遇到内核异常时KGDB会将控制权交给GDB,这样你可以查看栈中的回溯调用并定位造成内核异常的原因。
补充阅读建议
《Linux内核设计与实现(原书第3版)》,Robert Love,机械工业出版社,2011年1月出版。
《Linux内核编程》,Claudia Salzberg Rodriguez等,人民邮电出版社,2011年5月出版。
“使用GNU编译器集合”,Richard M. Stallman和GCC开发者社区,GNU出版社(自由软件基金会部门)。
http://gcc.gnu.org/onlinedocs/
“使用GDB进行调试”, Richard Stallman,Roland Pesch,Stan Shebs等,自由软件基金会。
www.gnu.org/software/gdb/documentation/
“kgdb的基本工作原理及使用”
www.kernel.org/doc/htmldocs/kgdb.html
工具接口标准,“DWARF调试信息格式规范”,版本2.0,TIS委员会,1995年5月。