内核通过 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/
分享到:
相关推荐
二、printk使用方法 1. 基本用法:`printk(KERN_INFO "这是调试信息:%d\n", some_variable);` 这种形式会打印出指定的日志级别和相应的消息,其中%d表示格式化整数输出。 2. 延时打印:使用`printk_delayed`函数...
本文将介绍 Linux 驱动程序调试的常用方法,包括利用 printk、查看 OOP 消息、利用 strace、利用内核内置的 hacking 选项、利用 ioctl 方法、利用/proc 文件系统、使用 kgdb 等七种方法。 一、利用 printk printk ...
例如,使用以下命令可以将 console_loglevel 设置为 1,所有的 printk 信息都不会被打印: `echo "1 4 1 7" > /proc/sys/kernel/printk` printk 的调用路径 printk 的调用路径如下: 1. printk 调用 vprintk ...
一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 dump_stack() 五 printk() 1 printk函数的健壮性 ...3 使用 Kprobes 更好地进行调试
这种方法简单易用,但可能会增加系统开销,因为频繁的Printk调用可能会影响系统的性能。 2. **利用Proc文件系统进行通信**:Proc文件系统是一个虚拟文件系统,它提供了访问内核数据结构和状态的接口。内核信息可以...
《Linux内核调试技术的研究》一文探讨了在Linux操作系统中进行内核调试的关键方法。Linux内核的开放源码特性使其成为开发者进行定制和优化的重要平台,然而,由于内核的复杂性和特殊性,调试内核驱动和应用程序时会...
本文主要探讨了两种常用的调试技术:使用`printk`函数和查看OOP(Out Of普)消息。 首先,`printk`是Linux内核中用于打印调试信息的关键函数,类似于C语言中的`printf`。通过在代码中插入`printk`语句,开发者可以...
本文将深入探讨Android系统的log使用方法及其背后的简单原理。 首先,我们要理解的是,在标准的Linux内核开发中,通常使用`printk`函数进行日志输出。`printk`类似于`printf`,但具有特定的打印级别,这些级别定义...
首先,printk是Linux内核中用于打印信息的主要函数,其使用方式与用户空间的printf函数类似。printk函数能够输出不同级别的信息到内核消息日志中,其中记录级别用数字0到7表示,数字越小表示级别越高,越紧急。在...
下面我们将详细地介绍 dev_dbg() 的作用和使用方法。 dev_dbg() 的作用是调用 printk(KERN_DEBUG )来输出打印信息,它可以帮助开发者在内核中输出调试信息,以便更好地了解内核的运行状态。要使用 dev_dbg(),我们...
使用`printk`的例子如下: ```c printk(KERN_ALERT "This is the log printed by printk in linux kernel space."); ``` 在Android系统中,`printk`输出的日志会被保存在`/proc/kmsg`中。开发者可以通过在Ubuntu环境...
- `printk()`函数的输出受到内核配置的影响,如果内核配置中没有开启某些功能,则可能会影响到`printk()`的使用。 - 使用`printk()`时要注意避免无限循环和其他可能导致系统挂起的操作。 #### 四、实践案例 1. *...
- **打印输出**:详细介绍 printk 的使用方法及其注意事项。 - **消息级别控制**:讲解如何控制 printk 输出的消息级别。 - **消息记录**:探讨如何将 printk 输出的消息记录到日志文件中。 - **内核oops信息**:...
以管道瓦斯综合参数测定仪为例,介绍了Linux下的时间测量方法Printk Time,并提出了Linux系统启动时间优化的3个阶段,分别是系统引导阶段、系统启动阶段和应用程序阶段。结合应用实例,提出一系列的优化措施,使得系统...
### 操作系统实验知识点概述 #### 一、Linux 内核模式与源代码的目录结构 ...通过这些操作,学生不仅能够熟悉Linux的基本命令,还能深入理解VI编辑器和GCC编译器的使用方法,从而更好地掌握操作系统的基础知识和技术。
### Linux内核调试技术详解 ...此外,我们还提到了几个关键的调试选项,如spinlock调试和使用gdb调试内核的方法。对于初学者来说,掌握这些基本的调试技巧对于顺利开发Linux设备驱动程序至关重要。