调试
准备开始
用户级的程序bug常常直截了当
内核中的bug不清晰
重现bug时,成功一大半
内核中的bug
独特的问题:定时限制,条件竞争
通过打印来调试
printk()函数
健壮性
随时可调用
在中断初始化后,都可以使用
日志等级
最重要的KERN_EMERG定为0,无关紧要的KERN_DEBUG定为7
记录缓冲区
内核消息保存在一个LOG_BUF_LEN的环形队列
超过大小,新消息覆盖老消息
syslogd和klogd
用户空间的守护进程klogd从记录缓冲区获取内核消息
通过syslogd守护进程保存在系统日志记录中
18.4 oops
向中断输出错误消息,寄存器信息,可供跟踪的回溯线索
ksymoops
未解码的oops通过ksymoops指令,转化为有意义的符号
kallsyms
定义CONFIG_KALLSYMS选项,在内核启动时创建地址到符号名称的映射
这会使得内核变大
CONFIG_KALLSYMS_ALL:还存放所有的符号名称
18.5 内核调试配置选项
为了方便调试测试内核代码,提供了许多配置选项
在内核配置编辑器的内核开发菜单项
CONFIG_PREEMPT=y
CONFIG_DEBUG_KERNEL=y
CONFIG_KALLSYMS=y
CONFIG_DEBUG_SPINLOCK_SLEEP=y
18.6 引发bug并打印信息
神奇的系统请求键
magic sysrq key
sysrq键:alt-PrintScreen
无论内核什么状态,都可以和内核通信
内核调试器
探测系统
用UID做选择条件
专门测试新算法