printk 内核调试 消息级别

内核调试相比于用户程序调试难度就要大很多。
LINUX 是 C 语言写的,但不能使用 printf 来打印,原因很容易解释,内核中不认识库
文件中的 printf 函数。
最普通的调试技术是监视,即在应用程序中的适当地方调用 printf 显示监视信息,这
是针对普通应用程序而言,对于 linux 内核则是通过 printk 来完成相应工作,函数 printk 的
使用方法和 printf 相似。
1、消息优先级(loglevel)
printk 根据日志级别(loglevel)对消息进行分类。
日志级别用宏定义,日志级别宏展开为一个字符串,在编译时由预处理器将它和消息
文本拼接成一个字符串,因此 printk 函数中日志级别宏和格式字符串间不能有逗号。
printk 的日志级别定义如下(在 include/linux/printk.h 中):
#define KERN_EMERG "<0>" /*紧急事件消息,系统崩溃之前提示,表示系统不可用*/
#define KERN_ALERT "<1>" /*报告消息,表示必须立即采取措施*/
#define KERN_CRIT "<2>" /*临界条件,通常涉及严重的硬件或软件操作失败*/
#define KERN_ERR "<3>" /*错误条件,驱动程序常用 KERN_ERR 来报告硬件的错误*/
#define KERN_WARNING "<4>" /*警告条件,对可能出现问题的情况进行警告*/
#define KERN_NOTICE "<5>" /*正常但又重要的条件,用于提醒。常用于与安全相关的消息*/
#define KERN_INFO "<6>" /*提示信息,如驱动程序启动时,打印硬件信息*/
#define KERN_DEBUG "<7>" /*调试级别的消息*/
日志级别的范围是 0~7,没有指定日志级别的 printk 语句默认采用的级别是
DEFAULT_ MESSAGE_LOGLEVEL,其定义列出如下:
/*没有定义日志级别的 printk 使用下面的默认级别*/
#define DEFAULT_MESSAGE_LOGLEVEL 4
/* KERN_WARNING 警告条件*/

内核设置了控制台的日志级别 console_loglevel。printk 日志级别的作用是打印一定级别
的消息,与之类似,控制台只显示一定级别的消息。当日志级别小于 console_loglevel 时,
消息才能显示出来。控制台相应的日志级别定义如下:
/* 显示比这个级别更重发的消息*/
#define MINIMUM_CONSOLE_LOGLEVEL  1   /*可以使用的最小日志级别*/
#define DEFAULT_CONSOLE_LOGLEVEL   7
/*比 KERN_DEBUG 更重要的消息都被打印*/
int console_printk[4] = {
DEFAULT_CONSOLE_LOGLEVEL,
/*控制台日志级别,优先级高于该值的消息将在控制台显示*/
/*默认消息日志级别,printk 没定义优先级时,打印这个优先级以上的消息*/
DEFAULT_MESSAGE_LOGLEVEL,
/*最小控制台日志级别,控制台日志级别可被设置的最小值(最高优先级)*/

MINIMUM_CONSOLE_LOGLEVEL,
DEFAULT_CONSOLE_LOGLEVEL,
/* 默认的控制台日志级别*/
};
通过读写/proc/sys/kernel/printk 文件可读取和修改控制台的日志级别。查看这个文件的
方法如下:
#cat /proc/sys/kernel/printk
6 4 1 7
上面显示的 4 个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日
志级别和默认的控制台日志级别。
可用下面的命令设置当前日志级别:
# echo 8 > /proc/sys/kernel/printk
通常,选用 KERN_INFO 和 KERN_DEBUG 作为调试级别。
2、示例
printk(KERN_INFO "Resume: load_image: ret = %d.\n", ret);
printk(KERN_INFO "Resume:test output the point %p\n", ptr);
注意:在 KERN_DEBUG、 KERN_INFO 和后面的输出语句之间没有逗号!

3、查看内核输出
在内核中,函数 printk 将消息打印到环形缓冲区__log_buf 中,并将消息传给控制台进
行显示。控制台驱动程序根据控制台的日志级别显示日志消息。
如果系统同时运行 klogd 和 syslogd,则无论 console_loglevel 为何值,内核消息都会追
加到/var/log/messages 中(否则按 syslogd 的配置处理)。如果 klogd 没有运行,则这些消息
不会传递至用户空间,这时只能查看/proc/kmsg 文件(使用 dmesg 命令即可)
实际使用过程中,通过 dmesg 信息可以获取内核输出的消息:
dmesg > xxxxx.log
#将内核消息输出到文件中
另外,通过访问/var/log/messages 文件,可以查看内核输出的消息,并且会保留多次的内容。
4、内核消息解析
使用“/usr/src/linux-headers-3.2.0-32/scripts”下的 show_delta 脚本,可以将 dmseg.log 内
容进行再整理,生成可显示开机时间段的文档。
/usr/src/linux-headers-3.2.0-32-generic/scripts/show_delta xxxx.log > xxxx-time.log


同事wiki 帖出来 方便查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值