linux内核printk调试手段,[Mini2440] 内核调试手段之 printk

Posted weixin_39715187

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内核printk调试手段,[Mini2440] 内核调试手段之 printk相关的知识,希望对你有一定的参考价值。

66b52468c121889b900d4956032f1009.png

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的主要内容,如果未能解决你的问题,请参考以下文章

linux内核调试技术之printk

基于FS4412嵌入式系统移植 linux内核调试之printk

如何调试linux内核?

[linux-内核][转]内核日志及printk结构浅析

Linux内核设计与实现 第十八章

嵌入式linux的调试技术