linux内核printk调试手段,[Mini2440] 内核调试手段之 printk
Posted weixin_39715187
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内核printk调试手段,[Mini2440] 内核调试手段之 printk相关的知识,希望对你有一定的参考价值。
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
一. 内核打印函数 printk 介绍
1.1 前言
内核提供了 printk 函数在内核运行时打印信息,类似于 C 语言中的 printf 函数。
使用方式:1printk( "打印内容");
什么是日志级别? 日志级别表示这句 log 的严重等级,总共有 8 个级别,分别是 0-7,数字越小级别越高。kernel 中可以设置屏蔽一些低级别的 log 不打印出来。
printk 的日志级别定义在 linux-2.6.32.2/inlcude/linux/kernel.h 中:1
2
3
4
5
6
7
8#define KERN_EMERG "<0>"
#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 condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */
简单解释一下:紧急事件消息,系统崩溃前的提示,表示系统不可用
报告事件,表示必须立刻采取措施
临界条件,通常涉及严重的硬件或软件失败
错误条件,驱动程序通常用此等级报告硬件错误
警告条件,对可能出现的问题进行警告
正常又重要的信息,用于提醒
提示信息,打印运行时的提示信息
调试信息,调试级别的消息
Kernel 中可以修改 /proc/sys/kernel/printk 节点修改 printk 打印相关的配置。1
2[[email protected] /]# cat /proc/sys/kernel/printk
7 4 1 7
其实这四个值是在kernel/printk.c 中被定义的,这四个数值分别表示:1
2
3
4
5
6int console_printk[4] = {
DEFAULT_CONSOLE_LOGLEVEL, /* console_loglevel 7 */
DEFAULT_MESSAGE_LOGLEVEL, /* default_message_loglevel 4 */
MINIMUM_CONSOLE_LOGLEVEL, /* minimum_console_loglevel 1 */
DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel 7 */
};
简单解释一下:当前控制台日志级别:优先级高于该值的消息将被打印至控制台
默认的消息日志级别:将用该优先级来打印没有优先级的消息
最高的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级)
默认的控制台日志级别:控制台日志级别的缺省值
当 printk 的消息日志级别小于当前控制台日志级别 DEFAULT_CONSOLE_LOGLEVEL 时,才会被打印出来。
1.2 示例模块
文件一:print_level.c1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32#include
#include
static int __init (void)
{
printk(KERN_EMERG "hello! KERN_EMERG = %sn", KERN_EMERG );
printk(KERN_ALERT "hello! KERN_ALERT = %sn", KERN_ALERT );
printk(KERN_CRIT "hello! KERN_CRIT = %sn", KERN_CRIT );
printk(KERN_ERR "hello! KERN_ERR = %sn", KERN_ERR );
printk(KERN_WARNING "hello! KERN_WARNING = %sn", KERN_WARNING);
printk(KERN_NOTICE "hello! KERN_NOTICE = %sn", KERN_NOTICE );
printk(KERN_INFO "hello! KERN_INFO = %sn", KERN_INFO );
printk(KERN_DEBUG "hello! KERN_DEBUG = %sn", KERN_DEBUG );
return 0;
}
static void __exit mod_exit(void)
{
printk(KERN_EMERG "goodbye! KERN_EMERG = %sn", KERN_EMERG );
printk(KERN_ALERT "goodbye! KERN_ALERT = %sn", KERN_ALERT );
printk(KERN_CRIT "goodbye! KERN_CRIT = %sn", KERN_CRIT );
printk(KERN_ERR "goodbye! KERN_ERR = %sn", KERN_ERR );
printk(KERN_WARNING "goodbye! KERN_WARNING = %sn", KERN_WARNING);
printk(KERN_NOTICE "goodbye! KERN_NOTICE = %sn", KERN_NOTICE );
printk(KERN_INFO "goodbye! KERN_INFO = %sn", KERN_INFO );
printk(KERN_DEBUG "goodbye! KERN_DEBUG = %sn", KERN_DEBUG );
}
module_init(mod_init);
module_exit(mod_exit);
MODULE_LICENSE("GPL");
文件二:Makefile1
2
3
4
5
6
7
8
9
10
11
12
13
14obj-m += print_level.o
KERNEL = /home/user/workspace/mini2440/linux-2.6.32.2
SHARE = /home/user/board
all:
make -C $(KERNEL) M=`pwd` modules
rm -rf $(SHARE)/*
cp -f *.ko $(SHARE)/
make clean
@echo "
以上是关于linux内核printk调试手段,[Mini2440] 内核调试手段之 printk的主要内容,如果未能解决你的问题,请参考以下文章