嵌入式linux的调试技术

时间:2023-01-23 20:16:41

  1、打印内核调试信息:printk函数的原型:

  asmlinkage int printk(const char *fmt,...)第1个参数表示格式字符串,后面是可变参数。第一个参数值前面加尖括号包含的数字表示输出的日志级别,共有8个级别,在linux/kernel.h头文件中定义。不管消息级别是多少,所有通过printk函数发出的消息都会输出到日志文件(就算有的消息输出到控制台,也会同时输出到日志文件)。

  2、防止printk函数降低linux驱动性能:虽然使用printk函数可以很方便地将消息写入日志文件或控制台,但大量使用printk函数频繁操作日志文件或控制台设备文件(/dev/console)会严重影响linux驱动的性能,因此,这就要求linux驱动只在开发阶段使用printk函数输出消息,在正式发布linux驱动是时将可能影响性能的printk函数去掉,通过利用C语言中的编译指令(#if\#else\#endif等)。

  3、在linux文件系统中,/proc经常被用来作为内核空间与用户空间进行数据交互的工具。/proc是虚拟文件系统,是内存映射。所有读写/proc的操作都是对内存的读写,所以读写/proc文件系统的速度要远比读写/dev文件系统的速度快,因此,/proc文件系统也可以作为linux驱动与用户空间程序交互的工具,将很多信息通过/proc文件系统由内核空间的程序向外界提供。

  4、linux系统中有很多命令(如free)就是通过分析/proc/meminfo文件的内容来显示系统内存资源的。

  5、在linux驱动程序中可以使用内核函数在/proc目录中创建和删除虚拟文件,也可以建立和删除虚拟目录。

  6、/pron 文件系统主要通过proc_dir_entry.read_proc和proc_dir_entry.read_write函数指针来设置读写/pron目录中的虚拟文件的动作处理函数,proc_dir_entry结构体代表一个虚拟目录或文件。

  7、调试工具:用于调试用户空间程序的gdb、gdbserver和调试内核空间程序的kgdb工具可以逐行跟踪程序的代码。gdb可以跟踪调试用户空间的程序,只能在PC上进行测试;用gdbserver 测试运行在开发板、手机或Android模拟器上的程序。gdbserver是一个可以运行在ARM架构上的服务端程序,在开发板上使用gdbserver打开要测试的程序,然后通过串口、有线或无线网络可以在PC上进行调试;kgdb远程调试内核程序,最好的内核调试工具。提供类似printk函数的复制输出功能,允许开发人员直接在PC上通过GDB链接目标设备

  8、当发现某些代码的bug太多或很难通过printk函数输出信息找出,可以考虑使用kgdb用step by step的方式定位bug。

                                                                                           17:03:16

                                                                                          2016-07-03