MENU

内核调试之 printk 打印

June 1, 2023 • 阅读: 878 • 笔记&折腾

printk 函数通常用在 Linux 内核中用于打印信息,可以将打印的信息输出在控制台或者某个文件当中。 与 printf 函数相似。

案例:

printk(KERN_WARNING "Hello kernel!\n");

在内核代码中插入该代码,当内核运行后代码执行至该处时,将会在控制台输出字符 "Hello kernel!" 。

其中 KERN_CONT 是打印优先级。可用的打印优先级有:

#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 */

#define KERN_CONT KERN_SOH "c" 

KERN_SOH 的数字越小,打印优先级越高。

在内核中插入的 printk 是否打印在控制台中,取决于控制台的打印优先级。可以使用以下命令查看当前控制台的打印优先级:

# cat /proc/sys/kernel/printk
7 4 1 7

这四个数字分别代表

  • 控制台打印优先级:优先级高于该值的printk打印才会输出到控制台重定向的串口或屏幕上
  • 默认的消息打印优先级
  • 最低的控制台打印优先级
  • 默认的控制台打印优先级

数字越小,优先级越高。

当控制台的打印优先级(7)低于内核中 printk 的消息打印优先级(KERN_WARNING : 4)时,在内核中的 printk 函数输出都会打印在控制台上。

可以通过以下命令修改 printk 的打印等级:

# echo 3 4 1 7 > /proc/sys/kernel/printk
# cat /proc/sys/kernel/printk
3 4 1 7

或者使用 dmesg 命令:

# dmesg -n 3

此时控制台的打印优先级(3)大于内核中 printk 的消息打印优先级(KERN_WARNING : 4),内核中的 printk 函数输出将不会打印在控制台上,而是保存在内核的日志缓存中,可以使用命令 dmesg 查看。

Leave a Comment