printk一些使用技巧

内核通过 printk() 输出的信息具有日志级别,日志级别是通过在 printk() 输出的字符串前加一个带尖括号的整数来控制的,如 printk("<6>Hello, world!/n");。内核中共提供了八种不同的日志级别,在 linux/kernel.h 中有相应的宏对应。

#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 */
#define KERN_INFO     "<6>"    /* informational */
#define KERN_DEBUG    "<7>"    /* debug-level messages */

所以 printk() 可以这样用:printk(KERN_INFO "Hello, world!/n");。

未指定日志级别的 printk() 采用的默认级别是 DEFAULT_MESSAGE_LOGLEVEL,这个宏在 kernel/printk.c 中被定义为整数 4,即对应KERN_WARNING。

在 /proc/sys/kernel/printk 会显示4个数值(可由 echo 修改),分别表示当前控制台日志级别、未明确指定日志级别的默认消息日志级别、最小(最高)允许设置的控制台日志级别、引导时默认的日志级别。当 printk() 中的消息日志级别小于当前控制台日志级别时,printk 的信息(要有/n符)就会在控制台上显示。但无论当前控制台日志级别是何值,通过 /proc/kmsg (或使用dmesg)总能查看。另外如果配置好并运行了 syslogd 或 klogd,没有在控制台上显示的 printk 的信息也会追加到 /var/log/messages.log 中。

char myname[] = "chinacodec/n";
printk(KERN_INFO "Hello, world %s!/n", myname);

 

可用的格式字符

---------------------------------------------------------
        int           		  %d or %x
        unsigned int          %u or %x
        long          		  %ld or %lx
        unsigned long         %lu or %lx
        long long      		  %lld or %llx
        unsigned long long    %llu or %llx
        size_t           	  %zu or %zx
        ssize_t          	  %zd or %zx

u64 SHOULD be printed with %llu/%llx, (unsigned long long):

    printk("%llu", (unsigned long long)u64_var);

s64 SHOULD be printed with %lld/%llx, (long long):

    printk("%lld", (long long)s64_var);
可参考
http://lxr.linux.no/#linux+v2.6.34/Documentation/printk-formats.txt

打印裸指针(raw pointer)%p,%p除了可以用来打印指针外还可以打印其它的信息
%pF可打印函数指针的函数名和偏移地址,%pf只打印函数指针的函数名,不打印偏移地址。
如
printk("%pf %pF\n", ptr, ptr) will print:

module_start module_start+0x0/0x62 [hello]
但是为了支持这个功能你需要开启CONFIG_KALLSYMS 选项
%pM打印冒号分隔的MAC地址,%pm打印MAC地址的16进制无分隔
如
printk("%pM %pm\n", mac, mac) will print:

2c:00:1d:00:1b:00 2c001d001b00
%I4打印无前导0的IPv4地址,%i4打印冒号分隔的IPv4地址
%i4打印无前导0的IPv6地址,%i6打印无冒号分隔的IPv6地址
如
printk("%pI4 %pi4\n", ip, ip) will print:

127.0.0.1 127.000.000.001
其它的特殊格式字符参见
http://lxr.linux.no/#linux+v2.6.34/lib/vsprintf.c#L930
参考
http://www.embedded-bits.co.uk/2010/printk-format-specifiers/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值