第十章嵌入式Linux的调试技术
第十章主要介绍如何利用开发板、Android模拟器以及一些函数、工具(gdb、gdbservice以及kgdb)调试嵌入式Linux内核模块、可执行程序和共享库。
对于复杂的Linux驱动以及HAL等程序库,需要使用设置断点、逐步跟踪代码、输出调试信息等方法对其进行调试。
对于嵌入式Linux内核模块、可执行程序、共享库的调试可能要更复杂一些。因为在大多数时候需要至少两台机器(开发机和目标机)经行调试。
第一节打印内核调试信息:printk
printk函数运行在内核空间,与运行在用户空间的printf函数类似。像Linux驱动这样的Linux内核程序只能使用printk函数输出调试信息。
在图形界面将printk文件的第一个数字设为8,仍然不会在控制台输出任何消息。只有在字符界面下的控制台,执行build.sh脚本文件,才能在控制台输出相应的消息。
第二节防止printk函数降低Linux驱动性能
由于大量使用printk函数频繁操作文件日志或者控制台文件(/dev/console)会严重影响Linux驱动的性能(写磁盘的速度远没有读写内存的速度快)。因此,要求Linux驱动只在开发阶段使用printk函数输出消息,在正式发布的Linux驱动是将可能影响性能的printk函数去掉。最好的方法是利用C语言中的编译指令(#if、#else、#endif等)。
第三节通过虚拟文件系统(/proc)进行数据交互
在Linux文件系统中,/proc经常被用来作为内核空间与用户空间进行数据交互的工具。/proc是虚拟文件系统,是内存映射。所有读写/proc的操作都是对内存的读写,同时速度远比读写/dev文件系统快速。/proc文件系统也可作为Linux驱动与用户空间程序交互的工具。
第四节调试工具
用gdb调试用户空间程序
用gdbserver远程调试用户空间程序
用kgdb远程调试内核程序