linux device drivers - debugging之printk

书籍“linux device drivers”第四章,主讲一些debugging skills。其中就有提到printk。

printk函数包括,打印优先级,格式化字符串,具体变参。

例如:

printk(KERN_DEBUG "Here I am: %s:%i\n", _ _FILE_ _, _ _LINE_ _);
printk(KERN_CRIT "I'm trashed; giving up on %p\n", ptr);

printk打印的消息,存储在环形buffer中,以及/proc/kmsg 文件中。

klogd通过读取/proc/kmsg 文件来接收打印消息。

klogd可以接收打印消息,并将其发送给syslogd服务。syslogd会对打印消息按照优先级进行归类,并且分发给不同的设施。这些设施需要关注对应优先级的打印消息。

在linux系统中klogd和syslogd服务同时被启动的时候,printk打印的消息会出现在var/log/messages 文件中。

如果klogd服务未启动,则消息会在/proc/kmsg 文件中,通过dmesg命令打印的消息就来自于这个文件。

可以通过文件/proc/sys/kernel/printk设置允许哪些级别的消息,能够打印在终端上。

 

注意printk打印的消息,除了显示在终端上,还是被重定向到其他文件中。

 

当驱动开发者不注意,例如在驱动硬件的时候fail了,而驱动会printk fail error信息,并且不停的重试,那么会不停的有打印消息出来。恰好接收端是个慢速设备,来不及接收这么多打印消息的话,CPU就会被占用殆尽。

因为当遇到需要不停的打印消息的时候,需要借助

printk_ratelimit

使用方法为:

if (printk_ratelimit(  ))
    printk(KERN_NOTICE "The printer is still on fire\n");

  

  

 

posted @ 2016-10-27 19:21  ironX  阅读(198)  评论(0编辑  收藏  举报