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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何让每天都过得有意义?
- 下一篇: linux计算机中文件意思,shell在