10:01-11:30 p75-p99
第四章 调试技术
内核中的调试支持
通常在内核配置的 kernel hacking 菜单中。
通过打印调试
printk
消息有优先级。类似 KERN_ALERT 的宏会被展开成尖括号中的整数。 <linux/kernel.h> 定义了8种这样的宏。数字越小严重程度越高。
klogd, syslogd
echo 8 > /proc/sys/kernel/printk
Q为什么在我的虚拟机上不起作用
重定向控制台消息
内核可以将消息发送到一个指定的虚拟控制台。通过调用 ioctl(TIOCLINUX)来指定接收消息的其他虚拟终端。
消息如何被记录
printk 将消息写到长度为 _ _LOG_BUF_LEN 字节的循环缓冲。该函数会唤醒那些睡眠在syslog系统调用上的进程,或者正在读取 /proc/kmsg 的进程。
请注意,直接读/proc/kmsg ,消息读后不会保留, 而syslog 读完数据,数据不会被消费掉。
开启及关闭消息
【编程技巧】 可个别或全局的开关printk语句
速度限制
不应该在正常情况下打印消息,只打印异常信息。
愚蠢的进程才会,遇到失败,不停尝试,同时无休止的打印出错信息。
应该设置一个标志位,确保出错信息只打印一次。应该使用 printk_ratelimit() 函数
打印设备编号
注意,只有遇到行结束符,printk 才会输出信息到控制台。
通过查询调试
因处理调试信息而引起系统变慢是不希望的,可以在 /etc/syslogd.conf 日志文件中对应项加上减号‘-’来解决。
为什么?
使用/proc文件系统
/proc下面的每个文件都绑定一个内核函数。用户读取这个文件时,该函数动态的生成文件的内容。
我们不建议在/proc下增加文件,而是应该通过sysfs来向外界导出信息。
为什么?
在/proc中实现文件
为创建一个/proc文件,驱动程序必须实现下面这个函数
int (*read_proc)()
【理解对 read_proc 的介绍 p87 】
不应该再使用 int (*get_info)() 因为已过时,且很可能在未来被取消。
创建自己的/proc文件
一旦定义好了一个read_proc 函数,就需要通过下面这个函数把它与一个/proc入口项连接起来。
create_proc_read_entry
卸载模块时,调用
remove_proc_entry
【理解 /proc 文件的不足, p89】
seq_file 接口
【没读懂 p90-93】
ioctl 方法
作为替代/proc文件的方法,我们可以转为调试涉及若干iotcl 命令。
使用 ioctl 的缺点是,必须另写一个程序来调用这个函数。
优点是,速度比读/proc快。同时就算调试被禁止之后,ioctl 命令还可以工作,唯一的代价是模块会大一些。
通过监视调试
strace命令是个功能非常强大的工具,它可以显示由用户空间所发出的所有系统调用。
【学会】
调试系统故障
如果看到说明系统故障的消息时,最好的办法是重启。
oops消息
【学会分析】
LDD3 D05 补
最新推荐文章于 2020-07-30 15:44:42 发布