当前位置: 首页>>技术教程>>正文


linux – 内核中打印输出到哪里去?

, , ,

问题描述

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

在哪里可以查看这些语句的输出?

EDIT1:我想做的是使用proc file-system写入内核。打印代码是

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

在kern.log中,当我尝试覆盖文件/proc /net /madwifi /ath1 /fractel_config(当然,时间会有所变化)时,会看到以下消息。

[ 8671.924873] proc write 
[ 8671.924919] 

有什么解释吗?

最佳方案

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

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

次佳方案

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

# cat /proc/sys/kernel/printk
4       4       1       7

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

$ sudo dmesg -n 7
$ cat /proc/sys/kernel/printk
7       4       1       7

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

第三种方案

您将使用命令dmesg获得输出

第四种方案

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

printk("test: hello world")

dmesg | grep test

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/8851.html,未经允许,请勿转载。