一、写linux设备驱动程序最难的地方就是没有强大的调试工具,一般间接或者直接的调试手段:
1. 利用printk
2. 查看OOP消息
3. 利用strace
4. 利用内核内置的hacking选项
5. 利用ioctl方法
6. 利用/proc文件系统
7. 使用kgdb
8. 使用systemtap
二、
1,利用printk函数将我们需要观察的参数打印出来
2,OOP消息,我们加载了驱动,如果有什么指针错误,接下来都会打印出来,这个我们根据打印的意思都可以查到是什么错误
3, strace
打印出用户空间程序所调用的系统调用,还能显示出系统调用的参数和返回值。举例:
以后再举例
4,利用内核内置的hacking选项
内核开发者在make menuconfig的Kernel hacking提供了一些内核调试选项。这些选项有助于我们调试驱动程序,因为当我们启用某些调试选项的时候,操作系统会在发现驱动运行有问题时给出一些错误提示信息,而这些信息非常有助于驱动开发者找出驱动中的问题所在。下面就举几个简单例子。
先启用如下选项:
- General setup — Configure standard kernel features (for small systems) — Load all symbols for debugging/ksymoops (NEW)
- Kernel hacking — Kernel debugging
- Device Drivers — Generic Driver Options — Driver Core verbose debug messages
1、Kernel debugging — Spinlock and rw-lock debugging: basic checks (NEW)可以检查到未初始化的自旋锁
2、Kernel debugging — Mutex debugging: basic checks (NEW) 可以检查到未初始化的信号量
717 //init_MUTEX(&scull_devices[i].sem);
详细举例:
///////////////////////////////////////////////////////////////以后再写//2016/11/12//////////////////////////////////////////////////////////////////////////
5,利用ioctl方法
由于驱动中的ioctl函数可以将驱动的一些信息返回给用户程序,也可以让用户程序通过ioctl系统调用设置一些驱动的参数。所以在驱动的开发过程中,可以扩展一些ioctl的命令用于传递和设置调试驱动时所需各种信息和参数,以达到调试驱动的目的。如何在驱动中实现ioctl,请参见“驱动程序对ioctl的规范实现”一文
6,利用/proc 文件系统
/proc文件系统用于内核向用户空间暴露一些内核的信息。因此出于调试的目的,我们可以在驱动代码中增加向/proc文件系统导出有助于监视驱动的信息的代码。这样一来,我们就可以通过查看/proc中的相关信息来监视和调试驱动。如何在驱动中实现向/proc文件系统导出信息,请参见《Linux Device Driver》的4.3节。
7,使用kgdb
kgdb是在内核源码中打用于调试内核的补丁,然后通过相应的硬件和软件,就可以像gdb单步调试应用程序一样来调试内核(当然包括驱动)。至于kgdb如何使用,就请你google吧,实在不行,百度一下也可以。
8,使用systemtap调试systemtap相当于往运行的内核里边添加了我们需要的代码,与其他诸如printk方式相比,systemtap动态的往正在运行的内核代码中注入需要的代码观察打印相关数据。