linux内核printk调试手段,[Mini2440] 内核调试手段之 printk
8種機(jī)械鍵盤軸體對比
本人程序員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎么選?
一. 內(nèi)核打印函數(shù) printk 介紹
1.1 前言
內(nèi)核提供了 printk 函數(shù)在內(nèi)核運(yùn)行時打印信息,類似于 C 語言中的 printf 函數(shù)。
使用方式:1printk( "打印內(nèi)容");
什么是日志級別? 日志級別表示這句 log 的嚴(yán)重等級,總共有 8 個級別,分別是 0-7,數(shù)字越小級別越高。kernel 中可以設(shè)置屏蔽一些低級別的 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 */
簡單解釋一下:緊急事件消息,系統(tǒng)崩潰前的提示,表示系統(tǒng)不可用
報告事件,表示必須立刻采取措施
臨界條件,通常涉及嚴(yán)重的硬件或軟件失敗
錯誤條件,驅(qū)動程序通常用此等級報告硬件錯誤
警告條件,對可能出現(xiàn)的問題進(jìn)行警告
正常又重要的信息,用于提醒
提示信息,打印運(yùn)行時的提示信息
調(diào)試信息,調(diào)試級別的消息
Kernel 中可以修改 /proc/sys/kernel/printk 節(jié)點(diǎn)修改 printk 打印相關(guān)的配置。1
2[[email?protected] /]# cat /proc/sys/kernel/printk
7 4 1 7
其實(shí)這四個值是在kernel/printk.c 中被定義的,這四個數(shù)值分別表示: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 */
};
簡單解釋一下:當(dāng)前控制臺日志級別:優(yōu)先級高于該值的消息將被打印至控制臺
默認(rèn)的消息日志級別:將用該優(yōu)先級來打印沒有優(yōu)先級的消息
最高的控制臺日志級別:控制臺日志級別可被設(shè)置的最小值(最高優(yōu)先級)
默認(rèn)的控制臺日志級別:控制臺日志級別的缺省值
當(dāng) printk 的消息日志級別小于當(dāng)前控制臺日志級別 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 "
總結(jié)
以上是生活随笔為你收集整理的linux内核printk调试手段,[Mini2440] 内核调试手段之 printk的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何让每天都过得有意义?
- 下一篇: linux计算机中文件意思,shell在