`

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/
分享到:
评论

相关推荐

    Kernel-Debug-Series-Part3-printk

    二、printk使用方法 1. 基本用法:`printk(KERN_INFO "这是调试信息:%d\n", some_variable);` 这种形式会打印出指定的日志级别和相应的消息,其中%d表示格式化整数输出。 2. 延时打印:使用`printk_delayed`函数...

    Linux驱动程序调试的常用方法.pdf

    本文将介绍 Linux 驱动程序调试的常用方法,包括利用 printk、查看 OOP 消息、利用 strace、利用内核内置的 hacking 选项、利用 ioctl 方法、利用/proc 文件系统、使用 kgdb 等七种方法。 一、利用 printk printk ...

    linux内核驱动调试方法1

    例如,使用以下命令可以将 console_loglevel 设置为 1,所有的 printk 信息都不会被打印: `echo "1 4 1 7" &gt; /proc/sys/kernel/printk` printk 的调用路径 printk 的调用路径如下: 1. printk 调用 vprintk ...

    linux内核调试方法总结

    一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 dump_stack() 五 printk() 1 printk函数的健壮性 ...3 使用 Kprobes 更好地进行调试

    内核信息获取的通信方法.pdf

    这种方法简单易用,但可能会增加系统开销,因为频繁的Printk调用可能会影响系统的性能。 2. **利用Proc文件系统进行通信**:Proc文件系统是一个虚拟文件系统,它提供了访问内核数据结构和状态的接口。内核信息可以...

    Linux内核调试技术的方法研究.pdf

    《Linux内核调试技术的研究》一文探讨了在Linux操作系统中进行内核调试的关键方法。Linux内核的开放源码特性使其成为开发者进行定制和优化的重要平台,然而,由于内核的复杂性和特殊性,调试内核驱动和应用程序时会...

    Linux系统驱动开发调试技术指南.docx

    本文主要探讨了两种常用的调试技术:使用`printk`函数和查看OOP(Out Of普)消息。 首先,`printk`是Linux内核中用于打印调试信息的关键函数,类似于C语言中的`printf`。通过在代码中插入`printk`语句,开发者可以...

    Android系统开发中log的使用方法及简单的原理

    本文将深入探讨Android系统的log使用方法及其背后的简单原理。 首先,我们要理解的是,在标准的Linux内核开发中,通常使用`printk`函数进行日志输出。`printk`类似于`printf`,但具有特定的打印级别,这些级别定义...

    linux内核调试简介

    首先,printk是Linux内核中用于打印信息的主要函数,其使用方式与用户空间的printf函数类似。printk函数能够输出不同级别的信息到内核消息日志中,其中记录级别用数字0到7表示,数字越小表示级别越高,越紧急。在...

    dev_dbg() 调试信息

    下面我们将详细地介绍 dev_dbg() 的作用和使用方法。 dev_dbg() 的作用是调用 printk(KERN_DEBUG )来输出打印信息,它可以帮助开发者在内核中输出调试信息,以便更好地了解内核的运行状态。要使用 dev_dbg(),我们...

    Android 实现自己的LOG信息

    使用`printk`的例子如下: ```c printk(KERN_ALERT "This is the log printed by printk in linux kernel space."); ``` 在Android系统中,`printk`输出的日志会被保存在`/proc/kmsg`中。开发者可以通过在Ubuntu环境...

    Linux调试技术介绍

    - `printk()`函数的输出受到内核配置的影响,如果内核配置中没有开启某些功能,则可能会影响到`printk()`的使用。 - 使用`printk()`时要注意避免无限循环和其他可能导致系统挂起的操作。 #### 四、实践案例 1. *...

    Linux设备驱动第三版

    - **打印输出**:详细介绍 printk 的使用方法及其注意事项。 - **消息级别控制**:讲解如何控制 printk 输出的消息级别。 - **消息记录**:探讨如何将 printk 输出的消息记录到日志文件中。 - **内核oops信息**:...

    uclinux下静态/动态加载驱动程序的方法

    本文将详细介绍在 uCLinux 系统下静态和动态加载驱动程序的具体方法及其背后的原理。 #### 二、静态加载驱动程序 静态加载是一种将驱动程序直接编译进内核的方法。这种方式下,一旦内核启动完成,驱动程序即可立即...

    基于Linux系统的管道瓦斯综合参数测定仪启动时间优化

    以管道瓦斯综合参数测定仪为例,介绍了Linux下的时间测量方法Printk Time,并提出了Linux系统启动时间优化的3个阶段,分别是系统引导阶段、系统启动阶段和应用程序阶段。结合应用实例,提出一系列的优化措施,使得系统...

    操作系统实验第一次

    ### 操作系统实验知识点概述 #### 一、Linux 内核模式与源代码的目录结构 ...通过这些操作,学生不仅能够熟悉Linux的基本命令,还能深入理解VI编辑器和GCC编译器的使用方法,从而更好地掌握操作系统的基础知识和技术。

Global site tag (gtag.js) - Google Analytics