MENU

内核调试之 printk 打印

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

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