printk
函数是Linux kernel
开发中用来打印log
的常用函数,同使用在用户空间程序的printf
函数很类似。实现代码如下:
asmlinkage int printk(const char *fmt, ...)
{
va_list args;
int r;
#ifdef CONFIG_KGDB_KDB
if (unlikely(kdb_trap_printk)) {
va_start(args, fmt);
r = vkdb_printf(fmt, args);
va_end(args);
return r;
}
#endif
va_start(args, fmt);
r = vprintk_emit(0, -1, NULL, 0, fmt, args);
va_end(args);
return r;
}
举个例子(注意KERN_ALERT
和"DEBUG ..."
之间没有逗号):
printk(KERN_ALERT "DEBUG: Passed %s %d \n",__FUNCTION__,__LINE__);
KERN_ALERT
代表log
的级别,参考kern_levels.h:
#define KERN_EMERG KERN_SOH "0" /* system is unusable */
#define KERN_ALERT KERN_SOH "1" /* action must be taken immediately */
#define KERN_CRIT KERN_SOH "2" /* critical conditions */
#define KERN_ERR KERN_SOH "3" /* error conditions */
#define KERN_WARNING KERN_SOH "4" /* warning conditions */
#define KERN_NOTICE KERN_SOH "5" /* normal but significant condition */
#define KERN_INFO KERN_SOH "6" /* informational */
#define KERN_DEBUG KERN_SOH "7" /* debug-level messages */
数字越大,代表优先级越低。
另外关于printk
格式化字符串形式,参考printk-formats.txt。
/proc/sys/kernel/printk
这个文件显示了和printk
相关的log
级别设置:
[root@localhost kernel]# cat /proc/sys/kernel/printk
7 4 1 7
4
个值的含义依次如下:
console_loglevel
:当前console
的log
级别,只有更高优先级的log
才被允许打印到console
;
default_message_loglevel
:当不指定log
级别时,printk
默认使用的log
级别;
minimum_console_loglevel
:console
能设定的最高log
级别;
default_console_loglevel
:默认的console
的log
级别。
请看下面这个例子:
[root@localhost kernel]# echo 8 > /proc/sys/kernel/printk
[root@localhost kernel]# cat /proc/sys/kernel/printk
8 4 1 7
可以看到,console_loglevel
的级别修改成了8
。
参考资料:
Debugging by printing