22

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

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

EDIT1:我想要做的是使用 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");
    ...

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

[ 8671.924873] proc write 
[ 8671.924919] 

有什么解释吗?

4

7 回答 7

27

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

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

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

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

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

于 2010-12-23T17:16:28.017 回答
13

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

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

于 2010-12-23T12:00:33.147 回答
6

您将使用命令获得输出dmesg

于 2010-12-23T11:52:21.883 回答
4

dmesg输出来自内核的所有消息。很难找到您想要的消息。更好地使用dmesggrepprintk组合,并在所有消息中使用驱动程序特定标签。这将有助于消除所有不需要的消息。

printk("test: hello world")

dmesg | grep test
于 2010-12-27T05:44:53.523 回答
1

我在 Ubuntu 11.10 和 10.04 LTS 上遇到了这个问题,在前者上我编辑了 /etc/rsyslog.d/50-default.conf,然后使用“sudo service rsyslog restart”重新启动了 rsyslog 以重新启动 rsyslogd。然后它起作用了。

请注意,Ubuntu 使用 * r *syslogd,而不是 syslogd。

于 2012-01-19T16:31:16.237 回答
0

In centos (Atleast in centos 6.6) the output will be in /var/log/messages

于 2014-12-07T16:33:43.900 回答
0

您可以尝试比 KERN_DEBUG 更高的级别,例如 KERN_INFO。根据您的配置,可能不会显示最低优先级的消息。

于 2010-12-23T15:57:25.500 回答