内核调试


调试

准备开始

用户级的程序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做选择条件

专门测试新算法

使用条件变量

使用统计量

限制重复限制

用二分查找法查找内核版本

用git二分搜索

社区


文章作者: N1co5in3
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 N1co5in3 !
  目录