18章调试
调试工作艰难是内核级开发区别于用户级开发的一个显著特点。
18.1 准备开始
内核调试往往是一个令人饶头不已的漫长过程。
1.一个BUG
2.一个藏匿BUG的内核版本
3.相关内核代码的知识和运气
18.2内核中的BUG
内核中的bug多种多样。
内核听起来很难,但事实上Linux内核与其他大型的软件项目也没有什么太大的不同。
18.3通过打印来调试
内核提供的打印函数printk()和C库提供的printf()函数功能几乎不同。
18.3.1健壮性
除非在启动过程的初期就要在终端输出
否则
认为printk在什么情况下都能工作
18.3.2日志等级
18.3.3记录缓冲区
优点:
健壮性:在中断上下文中也可以方便的使用。
简单性:使记录维护起来更容易。
缺点:
可能会丢失消息。
18.3.4.syslogd和klogd
(1)klogd
既可以从/proc/kmsg文件中,也可以通过syslog()系统调用读取这些消息。
默认是/proc方式。
两种情况klogd都会阻塞,知道有新的内核消息可供读出,唤醒之后默认处理是将消息传给syslogd。
可以通过-c标志来改变终端的记录等级
(2)syslogd
将它接收到的所有消息添加到一个文件中,默认是/var/log/messages。