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 "Here I am: %s:%i\n", __FILE__, __LINE__); //调试信息
printk(KERN_CRIT "I'm trashed; giving up on %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
根据记录级别,内核打印的消息可能输出的位置不同。
可以修改内核消息的级别,使内核消息出现在控制台:
Echo 8 > /proc/sys/kernel/printk
3、用查询来调试
虽然使用printk很方便,但大量使用printk会拖慢系统。
/proc文件系统是一个特殊的软件创建的文件系统,用来将内核的消息输出到外界,/proc下的每个文件都绑定到一个内核函数上。
4、使用查询来调试
strace 命令时一个有力工具, 显示所有的用户空间程序发出的系统调用. 它不仅显示调用, 还以符号
形式显示调用的参数和返回值. 当一个系统调用失败, 错误的符号值(例如, ENOMEM)和对应的字
串(Out of memory) 都显示. strace 有很多命令行选项; 其中最有用的是 -t 来显示每个调用执行的时
间, -T 来显示调用中花费的时间, -e 来限制被跟踪调用的类型, 以及-o 来重定向输出到一个文件. 缺
省地, strace 打印调用信息到 stderr
使用命令: strace ls /dev > /dev/scull0
5、调试系统故障
即便你已使用了所有的监视和调试技术, 有时故障还留在驱动里, 当驱动执行时系统出错. 当发生这个时, 能够收集尽可能多的信息来解决问题是重要的。