问题描述
我正在调试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_NOTICE
,KERN_INFO
和KERN_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