![如何避免内核 printk 环形缓冲区溢出?](https://linux22.com/image/28567/%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E5%86%85%E6%A0%B8%20printk%20%E7%8E%AF%E5%BD%A2%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%EF%BC%9F.png)
我正在尝试调试 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/