linux kernel内核、驱动日志调试方法(一)

本文是对网络资料进行总结归纳,抄录其他博客资料,如有侵权,请告知,进行删除

一:通过打印调试printk

printk是打印内核消息的函数,printk通过附加不同日志级别(loglevel)或者说消息优先级,让printk对消息进行分类,这是与printf最大的区别,在编译时,日志级别宏会被展开为一个字符串,然后与消息本文拼接在一起,因此printk中优先级和格式字符串之间没有逗号。
如果编译内核时选择了CONFIG_PRINTK=y,则会增加这个功能,否则所有printk都会被替换成空语句。
在内核驱动调试中,/proc/kmsg,/var/log/*,可以查看很多不同等级的日志信息
使用dmesg命令,可以查看/proc/kmsg,内核启动时的调试信息,

rsyslog是/usr/sbin/rsyslogd一个守护进程,从/proc/kmsg中持续读取,并写入/var/log/messages文件(通过/etc/rsyslog.conf配置)。
dmesg从/dev/kmsg中读取。
cat /dev/kmsg可以获得和dmesg几乎同样的效果,区别是命令最后会阻塞住等待新日志并持续打印。

这里是prink命令的两个例子,一条调试信息和一个临界信息:
printk(KERN_DEBUG “Here I am: %s:%i\n”, FILE, LINE);
printk(KERN_CRIT “I’m trashed; giving up on %p\n”, ptr);

在头文件<linux/kernel.h>中定义了8中可用的日志级别字符串,下面以严重程序的降序方式排列:

KERN_EMEGR:用于紧急事件消息,一般是系统崩溃之前提示的消息
KERN_ALERT:用于需要立即采取动作的情况
KERN_CRIT:临界状态,通常设计严重的硬件或软件操作失败
KERN_ERR:用于报告错误状态。设备驱动程序会经常使用该宏来报告来自硬件的问题
KERN_WARNING:对可能出现问题的情况进行警告,但这类情况通常不会对系统造成严重问题
KERN_NOTICE:有必要进行提示的正常情形。许多与安全相关的状态用这个级别进行汇报
KERN_INFO:提示性信息。很多驱动程序在启动的时候以这个级别来打印出它们找到的硬件信息
KERN_DEBUG:用于调试信息
上面每个字符串(以宏的形式展开)表示一个尖括号中的整数。范围分别为0~7。数值越小,优先级越高。

打印级别
默认打印机别
MESSAGE_LOGLEVEL_DEFAULT、CONSOLE_LOGLEVEL_DEFAULT宏

未指定优先级的printk语句采用的默认级别是MESSAGE_LOGLEVEL_DEFAULT;该宏在kernel/printk/printk.c中被指定为另一个宏CONFIG_MESSAGE_LOGLEVEL_DEFAULT,该宏通过config配置

在Linux 2.6.10内核中,MESSAGE_LOGLEV_ELDEFAULT就是KERN_WARNGIN(从config.gz中看到其值为4,说明为KERN_WARNING)

根据日志级别,内核会把消息打印到控制台上或者保存到dmesg中。这个控制台可以是一个字符串终端、一个打印机。当优先级小于console_loglevel这个整数变量时,消息才会打印到控制台,而且每次输出一行。

动态修改打印级别

我们可以通过对文本文件/proc/sys/kernel/printk的访问来读取和修改控制台的日志级别。文件中分别有4个数值字段,从左到右分别为:当前的日志级别、未明确指定日志级别时的默认消息级别、最小允许的日志级别、引导时的默认日志级别。向该文件中写入单个整数值,将会把当前日志级别修改为这个值。

~/$ cat /proc/sys/kernel/printk
4 4 1 7

var/log/下的日志,有这些日志,根据自己需求,定义日志

/var/log/messages或/var/log/syslog — 包括整体系统信息,其中也包含系统启动期间的日志。此外,mail,cron,daemon,kern和auth等内容也记录在var/log/messages日志中。
/var/log/dmesg — 包含内核缓冲信息(kernel ring buffer)。在系统启动时,会在屏幕上显示许多与硬件有关的信息。可以用dmesg查看它们。
/var/log/auth.log — 包含系统授权信息,包括用户登录和使用的权限机制等。
/var/log/boot.log — 包含系统启动时的日志。
/var/log/daemon.log — 包含各种系统后台守护进程日志信息。
/var/log/dpkg.log — 包括安装或dpkg命令清除软件包的日志。
/var/log/kern.log — 包含内核产生的日志,有助于在定制内核时解决问题。
/var/log/lastlog — 记录所有用户的最近信息。这不是一个ASCII文件,因此需要用lastlog命令查看内容。
/var/log/maillog 与 /var/log/mail.log — 包含来着系统运行电子邮件服务器的日志信息。例如,sendmail日志信息就全部送到这个文件中。
/var/log/user.log — 记录所有等级用户信息的日志。
/var/log/Xorg.x.log — 来自X的日志信息。
/var/log/alternatives.log — 更新替代信息都记录在这个文件中。
/var/log/btmp — 记录所有失败登录信息。使用last命令可以查看btmp文件。例如,last -f /var/log/btmp | more 。
/var/log/cups — 涉及所有打印信息的日志。
/var/log/anaconda.log — 在安装Linux时,所有安装信息都储存在这个文件中。
/var/log/yum.log — 包含使用yum安装的软件包信息。
/var/log/cron — 每当cron进程开始一个工作时,就会将相关信息记录在这个文件中。
/var/log/secure — 包含验证和授权方面信息。例如,sshd会将所有信息记录(其中包括失败登录)在这里。
/var/log/wtmp或/var/log/utmp — 包含登录信息。使用wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等。
/var/log/faillog —包含用户登录失败信息。此外,错误登录命令也会记录在本文件中。

消息如何被记录
printk函数将消息写到一个长度为__LOG_BUF_LEN字节的循环缓冲区中(ring buff),我们可在配置内核时为__LOG_BUF_LEN指定4KB-1MB之间的值。Linux消息处理方法的另一特点是,可以在任何地方调用printk,甚至在中断处理函数里,而且对数据的大小没有限制,唯一缺点是可能会丢失某些数据。

rsyslogd日志记录器由两个守护进程(rklogd,rsyslogd)和配置文件(/etc/rsyslog.conf),etc/rsyslog.d组成。rklogd不使用配置文件,它负责截获内核消息,它既可以独立使用也可以作为rsyslogd的客户端运行。rsyslogd默认使用/etc/syslog.conf作为配置文件,负责截获应用程序消息,还可以截获rklogd向其转发的内核消息,然后根据不同服务产生的消息分别记录到不同的文件中。

ubuntu:/etc/rsyslog.d# cat 50-default.conf 
#Default rules for rsyslog.
#For more information see rsyslog.conf(5) and /etc/rsyslog.conf

auth,authpriv.*                 	/var/log/auth.log
*.*;auth,authpriv.none          	-/var/log/syslog
#cron.*                         	/var/log/cron.log
#daemon.*                       	-/var/log/daemon.log
kern.*                         		-/var/log/kern.log
#lpr.*                          	-/var/log/lpr.log
mail.*                          	-/var/log/mail.log
#user.*                         	-/var/log/user.log

#mail.info                      -/var/log/mail.info
#mail.warn                     -/var/log/mail.warn
mail.err                        /var/log/mail.err

#Some "catch-all" log files.

#*.=debug;\
#auth,authpriv.none;\
#news.none;mail.none     -/var/log/debug
#*.=info;*.=notice;*.=warn;\
#auth,authpriv.none;\
#cron,daemon.none;\
#mail,news.none          -/var/log/messages

#Emergencies are sent to everybody logged in.
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值