Dmesg and Linux kernel log
来自百问网嵌入式Linux wiki
本文的目的是提供有关Linux®内核日志的信息,包括配置,并详细说明dmesg命令的用法。
目录
简介
- Linux内核能够打印日志和跟踪消息,它们默认情况下存储在环形缓冲区中。
- 使用串行端口在 uart/console 上应用过滤器,也可以显示相同的消息。这是在内核命令行中使用 "console" 参数定义的。有关详细信息,请参考[1]
- dmesg是内核控制台上的shell命令,该命令还会显示环形缓冲区的内容,带或不带过滤器(默认)。
printk函数
- 从内核代码中获取一些调试信息的最简单方法是通过打印出与内核等效的printf的各种信息-printk函数及其派生类。
- 请参阅elinux.org[2] 以获取参考。该信息将发送到控制台,并存储在环形缓冲区中。
printk("My Debugger is Printk\n");
- 您也可以查看Linux内核软件包中提供的printk-format.txt[3]文档,以获取有关语法和格式的详细信息。
linux kernel 环形缓冲区
- Linux内核管理环形缓冲区以存储日志和跟踪消息的方式。
- 缓冲区的大小无法在运行时修改,其默认大小值为 2^CONFIG_LOG_BUF_SHIF 字节。
- 要更改它,有3种可能的方式:
- 修改defconfig文件中的CONFIG_LOG_BUF_SHIFT值或使用配置参数文件:
In example for 64K : CONFIG_LOG_BUF_SHIFT=16
- 使用Linux内核menuconfig更新配置
Location: -> General setup -> Kernel log buffer size (16 => 64KB, 17 => 128KB)
- 在内核cmdline 行中修改内核参数 [4](通过设备树中的bootargs值,或直接在extlinux uboot配置文件中修改)
bootargs = "root=/dev/mmcblk0p5 rootwait rw console=ttySTM0,115200 log_buf_len=65536";
- 可以使用dmesg命令显示此环形缓冲区(请参阅下文 dmesg 章节)
log级别
- 如需了解详细信息,请参见elinux.org[5]。
- 内核使用日志级别来确定消息的重要性,并通过将消息打印到当前控制台来确定是否立即将消息提供给用户。
- 为此,内核将消息的日志级别与 console_loglevel(一个内核变量)进行比较,如果优先级高于console_loglevel(即,其优先级较低),则消息将被打印到当前控制台。例如,如果console_loglevel = 5,将显示日志级别为0到4的所有消息。
- 请注意,所有日志级别低于或等于KERN_INFO级别的消息都存储在环形缓冲区中。
log级别值说明
日志级别表
名称 | 串 | 含义 | 别名功能 | 开发者别名功能 | KERN_EMERG | "0” | 紧急消息,系统即将崩溃或不稳定 | pr_emerg | dev_emerg | KERN_ALERT | "1” | 发生了不好的情况,必须立即采取措施 | pr_alert | dev_alert | KERN_CRIT | "2” | 发生严重状况,例如严重的硬件/软件故障 | pr_crit | dev_crit | KERN_ERR | "3” | 错误状态,驱动程序经常使用该状态来指示硬件问题 | pr_err | dev_err | KERN_WARNING | "4” | 警告,本身并不严重,但可能表示问题 | pr_warning | dev_warn | KERN_NOTICE | "5” | 没什么严重的,但是值得注意的是。常用于报告安全事件 | pr_notice | dev_notice | KERN_INFO | "6” | 信息性消息,例如驱动程序初始化时的启动信息 | pr_info | dev_info | KERN_DEBUG | "7” | 调试信息 pr_debug,如果已定义DEBUG,则 | pr_devel | dev_dbg
设置控制台的日志级别过滤器值默认值
Board $> cat /proc/sys/kernel/printk 7 4 1 7 current default_msg minimum default_console
使用内核命令行
root=/dev/mmcblk0p5 rootwait rw console=ttySTM0,115200 loglevel=4
PC $> cd /media/$USER/bootfs/mmc0_stm32mp157c-ev1_extlinux/ PC $> gedit extlinux.conf
运行时使用sysfs修改等级
Board $> echo <loglevel> > /proc/sys/kernel/printk
Board $> echo 8 > /proc/sys/kernel/printk
请注意,重新启动后,此配置将被重置。
Symbol: CONSOLE_LOGLEVEL_DEFAULT [=7]
Location:
Kernel hacking --->
printk and dmesg options --->
(7) Default console loglevel (1-15)
Symbol: MESSAGE_LOGLEVEL_DEFAULT [=4]
Location:
Kernel hacking --->
printk and dmesg options --->
(4) Default message log level (1-7)
在内核源代码中使用loglevel进行日志和跟踪使用printk
printk(KERN_ERR "something went wrong, return code: %d\n",ret);
使用专用函数
pr_err("something went wrong, return code: %d\n",ret);
pr_info("%s%s%s at %s (irq = %d, base_baud = %d) is a %s\n",
port->dev ? dev_name(port->dev) : "",
port->dev ? ": " : "",
port->name,
address, port->irq, port->uartclk / 16, uart_type(port));
[ 0.919488] 40010000.serial: ttySTM0 at MMIO 0x40010000 (irq = 41, base_baud = 6046875) is a stm32-usart
dev_info(&pdev->dev, "interrupt mode used for rx (no dma)\n");
[ 1.046700] stm32-usart 40010000.serial: interrupt mode used for rx (no dma) Earlyprintk
Symbol: DEBUG_LL
Location:
Kernel hacking --->
[*] Kernel low-level debugging functions
Symbol: STM32MP1_DEBUG_UART
Location:
Kernel hacking --->
[*] Kernel low-level debugging functions
(*) Use STM32MP1 UART for low-level debug
Symbol: EARLY_PRINTK
Location:
Kernel hacking --->
[*] Early printk
Symbol: DEBUG_UART_PHYS [=0x40010000]
Location:
Kernel hacking --->
[*] Kernel low-level debugging port (Use STM32MP1 UART4 for low-level debug)
(0x40010000) Physical base address of debug UART
Symbol: DEBUG_UART_VIRT [=0xFE010000]
Location:
Kernel hacking --->
[*] Kernel low-level debugging port (Use STM32MP1 UART4 for low-level debug)
(0xFE010000) Virtual base address of debug UART
CONFIG_DEBUG_UART_PHYS: 0x40010000 /* UART4 */ CONFIG_DEBUG_UART_VIRT: 0xFE010000
另请参见TF-A-如何为FSBL更改进行调试)
dmesg命令
Board $> dmesg -n <loglevel>
Supported log levels (priorities):
emerg (0)
alert (1)
crit (2)
err (3)
warn (4)
notice (5)
info (6)
debug (7)
Board $> dmesg -n 8 # Temporary change loglevel to display messages up to debug level or Board $> dmesg -n debug
Board $> dmesg -c # Display the full content of dmesg ring buffer, and then clear it Board $> dmesg -C # Clear the dmesg ring buffer /var/log/messages文件系统条目
动态调试消息
参考
|
---|