如何避免内核 printk 环形缓冲区溢出?

如何避免内核 printk 环形缓冲区溢出?

我正在尝试调试 Linux 驱动程序,并且一段特定的代码表现得非常奇怪。为了了解发生了什么,我用 printk 语句填充了代码,这样我就可以准确地看到我感兴趣的变量在代码执行时做了什么。不幸的是,当打印带有大量行的环形缓冲区时,dmesg它似乎随机丢失。谷歌告诉我这是因为我一次向环形缓冲区写入了太多数据。我尝试将环形缓冲区大小增加到最大值(1 << 21),并且尝试插入 udelays 来减慢写入速度,但我仍然遇到同样的问题。

我还能尝试什么?

答案1

据我所知,klogd使用阻塞read()来读取/proc/kmsg.如果您通过 renice 提高其优先级,可能会有所帮助。您还可以尝试将内核日志写入 ramfs/tmpfs 以节省一些磁盘开销,可以通过syslog或 withklogd-f 选项直接写入文件。

否则,B计划是追踪trace_printk()http://lwn.net/Articles/365835/

相关内容