内核中的打印输出在哪里?

apo*_*020 20 linux ubuntu linux-kernel printk

我正在调试linux的驱动程序(特别是ubuntu服务器9.04),代码中有几个printf语句.

我在哪里可以查看这些陈述的输出?

编辑1:我要做的是使用proc文件系统写入内核.打印代码是

static int proc_fractel_config_write(struct file *file, const char *argbuf, unsigned long count, void *data)
{
    printk(KERN_DEBUG "writing fractel config\n");
    ...
Run Code Online (Sandbox Code Playgroud)

在kern.log中,当我尝试覆盖文件/ proc/net/madwifi/ath1/fractel_config(当然具有不同的时间)时,我看到以下消息.

[ 8671.924873] proc write 
[ 8671.924919] 
Run Code Online (Sandbox Code Playgroud)

任何解释?

ctu*_*fli 25

很多时候KERN_DEBUG级别消息被过滤,您需要显式提高日志记录级别.您可以通过检查查看系统默认值/proc/sys/kernel/printk.例如,在我的系统上:

# cat /proc/sys/kernel/printk
4       4       1       7
Run Code Online (Sandbox Code Playgroud)

第一个数字显示控制台日志级别KERN_WARNING(有关更多信息,请参阅proc(5)手册页).这意味着KERN_NOTICE,KERN_INFOKERN_DEBUG消息将从控制台进行过滤.要提高日志记录级别或详细程度,请使用dmesg

$ sudo dmesg -n 7
$ cat /proc/sys/kernel/printk
7       4       1       7
Run Code Online (Sandbox Code Playgroud)

在这里,将级别设置为7(KERN_DEBUG)将允许所有级别的消息显示在控制台上.要自动执行此操作,请将loglevel=N添加到内核​​引导参数,其中N是要进入控制台的日志级别,或者ignore_loglevel将所有内核消息打印到控制台.


Blr*_*rfl 12

它取决于分布,但许多用于klogd(8)从内核获取消息,并将它们记录到文件(有时/var/log/dmesg/var/log/kernel)或通过系统日志记录syslog(3).在后一种情况下,日志条目最终将取决于配置syslogd(8).

关于dmesg命令的一个注意事项:内核消息存储在循环缓冲区中,因此将覆盖大量输出.


chr*_*ris 5

您将使用该命令获得输出 dmesg

  • 它们真的是"printf"声明吗?他们真的应该是"printk",我不认为printf是在内核中定义的(如果我错了,请纠正我). (2认同)

小智 5

dmesg输出来自内核的所有消息。找到您想要的消息会很困难。最好使用dmesggrep组合,并在所有消息中使用特定于驱动程序的标签printk。这将轻松消除所有不需要的消息。

printk("test: hello world")

dmesg | grep test
Run Code Online (Sandbox Code Playgroud)