dmesg未显示printk语句

17

我正在尝试创建一个 proc entry。 我的 init_module 函数如下:

int init_module()
{
printk(KERN_INFO "proc2:Module Loaded\n");
proc_entry=proc_create_data(proc_name,0644,NULL,&fops,NULL);
if(proc_entry==NULL)
{
    printk(KERN_INFO "proc2:Error registering proc entry");
}
else
{
    printk(KERN_INFO "proc2:Proc Entry Created");
}
return 0;
}

以下是清理方法

void cleanup_module()
{
printk(KERN_INFO "proc2:module unloaded");
remove_proc_entry(proc_name,proc_entry);
}

程序的其余部分包括变量定义和回调函数。

当我编译这个程序时,编译器没有报错。但是当我使用insmod命令时,它没有回应提示符。通过lsmod命令,我的模块被列出并显示一个已使用(不知道是什么)。dmesg命令没有显示以上任何一个printk消息。

你能告诉我这里出了什么问题吗?

3个回答

26
尝试使用echo "7" > /proc/sys/kernel/printk来启用所有控制台日志级别。 这些数字对应以下内容:
#define KERN_EMERG "<0>" /* system is unusable*/
#define KERN_ALERT "<1>" /* action must be taken immediately*/
#define KERN_CRIT "<2>" /* critical conditions*/
#define KERN_ERR "<3>" /* error conditions*/
#define KERN_WARNING "<4>" /* warning conditions*/
#define KERN_NOTICE "<5>" /* normal but significant condition*/
#define KERN_INFO "<6>" /* informational*/
#define KERN_DEBUG "<7>" /* debug-level messages*/

默认数字为4,这使得控制台仅显示至少在KERN_WARNING级别的消息。这就是为什么您无法在KERN_INFO级别中看到日志的原因。


出人意料的是,仅仅通过使用echo "7" > /proc/sys/kernel/printk命令,不仅KERN_INFO消息得以输出,整个模块也开始正常工作。 - Kumar Gaurav
1
因为“7”允许显示从KERN_DEBUG到KERN_EMERG的各种日志,而不仅仅是KERN_INFO特定的。 - Wayne
3
我想补充一点,只有用户是root时才能成功执行。否则重定向将失败。可以用| sudo tee替换重定向以使其生效。 - russoue
3
@russoue: 或者 sudo sh -c 'echo 7 > /proc/sys/kernel/printk' 的意思是以超级用户的身份执行该命令,将数字 7 写入到 /proc/sys/kernel/printk 文件中,从而调整内核打印消息的级别。 - Keith Thompson

2
即使使用了echo "7" > /proc/sys/kernel/printkprintk仍然不能正常工作。根据https://lwn.net/Articles/487437/中的介绍,有一个改进版或更强大的printk称为pr_** api(pr_infopr_emerg)。我使用pr_info代替printk,问题得到了解决。请保留HTML标签。

甚至 pr_info() 对我也不起作用 :( 我把它放在 do_tcp_getsockopt() 中,然后执行了一个 wget 到公共的 www 网站。 - Sridhar Sarnobat
4
这个答案只会增加混乱。pr_info是一个宏,用于打印KERN_INFO级别的日志。你还没有贴出你的代码(可能缺少KERN_INFO或其他问题),这样读者只能猜测。 - domen

1
除了Wayne's Answer之外,内核源代码也有所说。

如果设置了CONFIG_DYNAMIC_DEBUG,此宏将扩展为dynamic_pr_debug()。否则,如果定义了DEBUG,则相当于具有KERN_DEBUG日志级别的printk。如果未定义DEBUG,则不执行任何操作。

这意味着您需要定义DEBUG或使用动态调试。我成功通过以下方式加载了带有调试printk的模块。
$ sudo insmod module-name.ko dyndbg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接