热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

当前位置 :| 主页>Linux教程>内核研究>

linux 内核调试(一)

来源: 作者: 时间:2008-05-16 Tag: 点击:


Loglevels

printk()printf()一个最主要的区别就是前者可以指定一个记录级别。内核根据这个级别来判断是否在终端上打印消息。内核把级别比某个特定值低的所有消息显示在终端上。
       可以通过下面这种方式指定一个记录级别:

printk(KERN_WARNING “This is a warning!\n”);
printk(KERN_DEBUG “This is a debug notice!\n”);
printk(“ I did not specify a loglevel!\n”);

KERN_WARINGKERN_DEBUG都是<linux/kernel.h>中的简单宏定义。它们扩展开是像“<4>”或“<7>”这样的字符串,加进printk()函数要打印的消息的开头。内核用这个指定的记录等级和当前终端的记录等级console_loglevel来决定是不是向终端上打印。表1列举了所有可供使用的记录等级。
1 可供使用的记录等级

记录等级
描述
KERN_EMERG
一个紧急情况
KERN_ALERT
一个需要立即被注意到的错误
KERN_CRIT
一个临界情况
KERN_ERR
一个错误
KERN_WARNING
一个警告
KERN_NOTICE
一个普通的,不过也有可能需要注意的情况
KERN_INFO
一条非正式的消息
KERN_DEBUG
一条调试信息——一般是冗余信息

如果你没有特别指定一个记录等级,函数会选用默认的DEFAULT_MESSAGE_LOGLEVEL,现在默认等级是KERN_WARNING。由于这个默认值将来存在变化的可能性,所以还是应该给你自己的消息指定一个记录等级。
    内核将最重要的记录等级KERN_EMERG定为“<0>”,将无关紧要的记录等级“KERN_DEBUG”定为“<7>”。举例来说,当编译预处理完成之后,前例中的代码实际被编译成如下格式:

printk(“<4> This is a warning!\n”);
printk(“<7>This is a debug notice!\n”);
printk(“<4>I did not specify a loglevel!\n”);

怎样给你调用的printk()赋记录等级完全取决于你自己。那些正式的、需要你保持的消息应该有合适的记录等级。但是那些当你试图解决一个问题时加得到处都是的调试信息——必须承认,我们都这么干而且也确实行得通——可以按照你的想法赋给记录等级。一种选择是保持你的终端的默认记录等级不变,给你的所有调试信息KERN_CRIT或更低的等级。相反,你也可以给你的所有调试信息KERN_DEBUG等级,而调整你终端的默认记录等级。两种方法各有利弊,自己拿主意吧。

BTW:我的毕业设计的学生在调试内核代码时,遇到不少问题,在此把《LDK》中调试一章的内容专门贴出来,给大家参考。


相关文章:
精通initramfs构建step by step
Linux利用kexec迅速切换内核
进程上下文VS中断上下文
内核通知链 学习笔记
linux spi子系统驱动分析
menuconfig 配置选项
《Linux操作系统内核实习》之练习一
udev详解
什么叫微内核,宏内核?
Linux 信号signal处理机制
开发简单的 Linux2.6 内核模块
删除内核的perl脚本
Linux2.6内核usb gadget驱动移植
GCC hacks in the Linux kernel
iomem
kernel学习的想法
让自己的驱动支持udev
linux内核编译步骤
内核的等待队列
Linux内核wait_queue深入分析
升级和删除内核
SD卡驱动分析2
Linux Kernel VDSO本地权限提升漏洞
内核中的TCP的追踪分析-15-TCP(IPV4)的客户端与
linux 2.6内核可加载模块的编译
内核模块HelloWorld
在环回接口上发送一个数据报
ARP初始化
1分钟编译FreeBSD内核
linux设备模型之uart驱动架构分析