2

我正在开发一个有趣的简单驱动程序,并且我正在尝试使用printk消息对其进行调试。似乎dmesg不显示最后printk一条消息,让它显示最后一条消息的唯一方法是做 another printk,这反过来也被dmesg.

一些澄清示例:在我的模块的 init 函数中,我打印以下语句:

printk(KERN_INFO "%s loaded with major: %u, minor: 0", ...);

insmod启动后第一次 ing 后,我看到一条带有 的“受污染的内核”消息dmesg,但是我看不到我打印的消息。

然后,我运行以下命令:

cat /dev/mymodule

它调用我open打印的函数:

printk(KERN_DEBUG "%s opened", ...);

然后调用我read打印的函数:

printk(KERN_DEBUG "%s reading", current->comm);

然后去睡觉。运行后dmesg(当 read 函数休眠时),我突然可以看到我的模块初始化消息,也可以看到“cat opens”消息,但是“cat reading”消息不见了。

使用 ctrl+c 终止 cat 会导致两次打印:“sleep interrupted”,然后是“cat release”。运行dmesg显示“睡眠中断”消息,但缺少“猫释放”消息,依此类推。

有谁知道问题可能是什么?

4

1 回答 1

2

您应该在每条 printk 消息的末尾添加 \n,以免错过 dmesg 中的任何日志。这将解决您的问题。

于 2019-08-13T06:40:40.967 回答