1、内核中的调试
开发中需要激活的配置选项
CONFIG_DEBUG_KERNEL
CONFIG_DEBUG_SLAB
CONFIG_DEBUG_PAGEALLOC
CONFIG_DEBUG_SPINLOCK
CONFIG_DEBUG_SPINLOCK_SLEEP
CONFIG_INIT_DEBUG
CONFIG_DEBUG_INFO
CONFIG_MAGIC_SYSRQ
CONFIG_DEBUG_STACKOVERFLOW
CONFIG_DEBUG_STACK_USAGE
CONFIG_KALLSYMS
CONFIG_IKCONFIG
CONFIG_IKCONFIG_PROC
CONFIG_ACPI_DEBUG
CONFIG_DEBUG_DRIVER
CONFIG_SCSI_CONSTANTS
CONFIG_INPUT_EVBUG
CONFIG_PROFILING
2、用打印调试
最常用的调试技术是监视,在程序的适当地方调用printk。
Printk允许你根据消息的严重程度不同进行分类。
printk(KERN_DEBUG"HereIam:%s:%i\n",__FILE__,__LINE__);//调试信息
printk(KERN_CRIT"I'mtrashed;givingupon%p\n",ptr);//紧急信息
一共有八种情况等级:
KERN_EMERG
用于紧急消息,常常是那些崩溃前的消息.
KERN_ALERT
需要立刻动作的情形.
KERN_CRIT
严重情况,常常与严重的硬件或者软件失效有关.
KERN_ERR
用来报告错误情况;设备驱动常常使用KERN_ERR来报告硬件故障.
KERN_WARNING
有问题的情况的警告,这些情况自己不会引起系统的严重问题.
KERN_NOTICE
正常情况,但是仍然值得注意.在这个级别一些安全相关的情况会报告
KERN_INFO
信息型消息.在这个级别,很多驱动在启动时打印它们发现的硬件的信息.
KERN_DEBUG
用作调试消息
没有指定优先级的printk语句默认是DEFAULT_MESSAGE_LOGLEVEL即KERN_WARNING
根据记录级别,内核打印的消息可能输出的位置不同。
可以修改内核消息的级别,使内核消息出现在控制台:
Echo8>/proc/sys/kernel/printk
3、用查询来调试
虽然使用printk很方便,但大量使用printk会拖慢系统。
/proc文件系统是一个特殊的软件创建的文件系统,用来将内核的消息输出到外界,/proc下的每个文件都绑定到一个内核函数上。
4、使用查询来调试
strace命令时一个有力工具,显示所有的用户空间程序发出的系统调用.它不仅显示调用,还以符号
形式显示调用的参数和返回值.当一个系统调用失败,错误的符号值(例如,ENOMEM)和对应的字
串(Outofmemory)都显示.strace有很多命令行选项;其中最有用的是-t来显示每个调用执行的时
间,-T来显示调用中花费的时间,-e来限制被跟踪调用的类型,以及-o来重定向输出到一个文件.缺
省地,strace打印调用信息到stderr
使用命令:stracels/dev>/dev/scull0
5、调试系统故障
即便你已使用了所有的监视和调试技术,有时故障还留在驱动里,当驱动执行时系统出错.当发生这个时,能够收集尽可能多的信息来解决问题是重要的。