当前位置: 技术问答>linux和unix
printk 信息那里去了?
来源: 互联网 发布时间:2016-07-05
本文导语: 在PC上调试 hello.ko insmod ./hello.ko 之后 终端没有信息显示, 参考linux设备驱动edition3 ,有如下解释: 依据你的系统用来递交消息行的机制, 你的输出可能不同. 特别地, 前面的屏幕输出是来自一个字符控制台; 如果你...
在PC上调试 hello.ko
insmod ./hello.ko 之后
终端没有信息显示,
参考linux设备驱动edition3 ,有如下解释:
依据你的系统用来递交消息行的机制, 你的输出可能不同. 特别地, 前面的屏幕输出是来自一个字符控制台; 如果你从一个终端模拟器或者在窗口系统中运行 insmod 和 rmmod, 你不会在你的屏幕上看到任何东西. 消息进入了其中一个系统日志文件中, 例如 /var/log/messages (实际文件名子随 Linux 发布而变化).
这句话如何理解?
insmod ./hello.ko 之后
终端没有信息显示,
参考linux设备驱动edition3 ,有如下解释:
依据你的系统用来递交消息行的机制, 你的输出可能不同. 特别地, 前面的屏幕输出是来自一个字符控制台; 如果你从一个终端模拟器或者在窗口系统中运行 insmod 和 rmmod, 你不会在你的屏幕上看到任何东西. 消息进入了其中一个系统日志文件中, 例如 /var/log/messages (实际文件名子随 Linux 发布而变化).
这句话如何理解?
|
输入dmesg 看看可有。
没有的话说明没有运行到。
那句话就是说不是字符终端就看不到这些信息。
没有的话说明没有运行到。
那句话就是说不是字符终端就看不到这些信息。
|
其中一个不同点是,printk允许你按照相关的记录级或优先级将消息严格分类。通常你需要一个宏来指定记录等级。例如,KERN_INFO,我们在早先的的例子中看到过这个宏,它就是消息记录等级的一种。记录等级宏的作用是扩展为一个字符串,这个字符串会在编译期间与相应的消息文本相连接;这就解释了下面例子中为什么在优先级和格式化字符串之间没有逗号了。下面是两个printk函数的例子,一个是调试消息,一个是临界消息:
printk(KERN_DEBUG "Here I am: %s:%in", _ _FILE_ _, _ _LINE_ _);
printk(KERN_CRIT "I'm trashed; giving up on %pn", ptr);
There are eight possible loglevel strings, defined in the header ; we list them in order of decreasing severity:
在头文件中共定义了八个可用的记录级;我们下面按其严重性倒序列出:
KERN_EMERG
Used for emergency messages, usually those that precede a crash.
用于突发性事件的消息,通常在系统崩溃之前报告此类消息。
KERN_ALERT
A situation requiring immediate action.
在需要立即操作的情况下使用此消息。
KERN_CRIT
Critical conditions, often related to serious hardware or software failures.
用于临界条件下,通常遇到严重的硬软件错误时使用此消息。
KERN_ERR
Used to report error conditions; device drivers often use KERN_ERR to report hardware difficulties.
用于报告错误条件;设备驱动经常使用KERN_ERR报告硬件难题。
KERN_WARNING
Warnings about problematic situations that do not, in themselves, create serious problems with the system.
是关于问题状况的警告,一般这些状况不会引起系统的严重问题。
KERN_NOTICE
Situations that are normal, but still worthy of note. A number of security-related conditions are reported at this level.
该级别较为普通,但仍然值得注意。许多与安全性相关的情况会在这个级别被报告。
KERN_INFO
Informational messages. Many drivers print information about the hardware they find at startup time at this level.
信息消息。许多驱动程序在启动时刻用它来输出获得的硬件信息。
KERN_DEBUG
Used for debugging messages.
用于输出调试信息
Each string (in the macro expansion) represents an integer in angle brackets. Integers range from 0 to 7, with smaller values representing higher priorities.
每一个字符串(由宏扩展而成)表示了尖括号内的一个整数。数值范围从0到7,数值越小,优先级越高。
A printk statement with no specified priority defaults to DEFAULT_MESSAGE_LOGLEVEL, specified in kernel/printk.c as an integer. In the 2.6.10 kernel, DEFAULT_MESSAGE_LOGLEVEL is KERN_WARNING, but that has been known to change in the past.
一个printk的缺省优先级是DEFAULT_MESSAGE_LOGLEVEL,它是一个在kernel/printk.c文件中指定的整数。在 2.6.10内核中,DEFAULT_MESSAGE_LOGLEVEL相当于KERN_WARNING,但据说在早期版本中这是两个不同的优先级。
Based on the loglevel, the kernel may print the message to the current console, be it a text-mode terminal, a serial port, or a parallel printer. If the priority is less than the integer variable console_loglevel, the message is delivered to the console one line at a time (nothing is sent unless a trailing newline is provided). If both klogd and syslogd are running on the system, kernel messages are appended to /var/log/messages (or otherwise treated depending on your syslogd configuration), independent of console_loglevel. If klogd is not running, the message won't reach user space unless you read /proc/kmsg (which is often most easily done with the dmesg command). When using klogd, you should remember that it doesn't save consecutive identical lines; it only saves the first such line and, at a later time, the number of repetitions it received.
基于这些记录级,内核可以把消息输出到当前的控制台,也可以是一个文本模式的终端,一个串口,或是一个并口打印机。如果优先级小于整形变量 console_loglevel,那么一次将会只发送一行消息到控制台中(除非遇到一个换行符,否则将什么都不会发送)。如果系统中运行了klogd和syslogd进程,那么内核消息就会被完整地添加到/var/log/messages文件中(或者根据你的syslogd进程的配置状况进行发送)而忽略console_loglevel,如果klogd没有运行,那么消息将不会到达用户空间,除非你对/proc/kmsg文件读取(实际上这项工作已被较早的dmesg命令完成)。当使用klogd时,你应该记住它不会保留重复的消息行;对于它接收到的重复消息,它只会保留第一条
printk(KERN_DEBUG "Here I am: %s:%in", _ _FILE_ _, _ _LINE_ _);
printk(KERN_CRIT "I'm trashed; giving up on %pn", ptr);
There are eight possible loglevel strings, defined in the header ; we list them in order of decreasing severity:
在头文件中共定义了八个可用的记录级;我们下面按其严重性倒序列出:
KERN_EMERG
Used for emergency messages, usually those that precede a crash.
用于突发性事件的消息,通常在系统崩溃之前报告此类消息。
KERN_ALERT
A situation requiring immediate action.
在需要立即操作的情况下使用此消息。
KERN_CRIT
Critical conditions, often related to serious hardware or software failures.
用于临界条件下,通常遇到严重的硬软件错误时使用此消息。
KERN_ERR
Used to report error conditions; device drivers often use KERN_ERR to report hardware difficulties.
用于报告错误条件;设备驱动经常使用KERN_ERR报告硬件难题。
KERN_WARNING
Warnings about problematic situations that do not, in themselves, create serious problems with the system.
是关于问题状况的警告,一般这些状况不会引起系统的严重问题。
KERN_NOTICE
Situations that are normal, but still worthy of note. A number of security-related conditions are reported at this level.
该级别较为普通,但仍然值得注意。许多与安全性相关的情况会在这个级别被报告。
KERN_INFO
Informational messages. Many drivers print information about the hardware they find at startup time at this level.
信息消息。许多驱动程序在启动时刻用它来输出获得的硬件信息。
KERN_DEBUG
Used for debugging messages.
用于输出调试信息
Each string (in the macro expansion) represents an integer in angle brackets. Integers range from 0 to 7, with smaller values representing higher priorities.
每一个字符串(由宏扩展而成)表示了尖括号内的一个整数。数值范围从0到7,数值越小,优先级越高。
A printk statement with no specified priority defaults to DEFAULT_MESSAGE_LOGLEVEL, specified in kernel/printk.c as an integer. In the 2.6.10 kernel, DEFAULT_MESSAGE_LOGLEVEL is KERN_WARNING, but that has been known to change in the past.
一个printk的缺省优先级是DEFAULT_MESSAGE_LOGLEVEL,它是一个在kernel/printk.c文件中指定的整数。在 2.6.10内核中,DEFAULT_MESSAGE_LOGLEVEL相当于KERN_WARNING,但据说在早期版本中这是两个不同的优先级。
Based on the loglevel, the kernel may print the message to the current console, be it a text-mode terminal, a serial port, or a parallel printer. If the priority is less than the integer variable console_loglevel, the message is delivered to the console one line at a time (nothing is sent unless a trailing newline is provided). If both klogd and syslogd are running on the system, kernel messages are appended to /var/log/messages (or otherwise treated depending on your syslogd configuration), independent of console_loglevel. If klogd is not running, the message won't reach user space unless you read /proc/kmsg (which is often most easily done with the dmesg command). When using klogd, you should remember that it doesn't save consecutive identical lines; it only saves the first such line and, at a later time, the number of repetitions it received.
基于这些记录级,内核可以把消息输出到当前的控制台,也可以是一个文本模式的终端,一个串口,或是一个并口打印机。如果优先级小于整形变量 console_loglevel,那么一次将会只发送一行消息到控制台中(除非遇到一个换行符,否则将什么都不会发送)。如果系统中运行了klogd和syslogd进程,那么内核消息就会被完整地添加到/var/log/messages文件中(或者根据你的syslogd进程的配置状况进行发送)而忽略console_loglevel,如果klogd没有运行,那么消息将不会到达用户空间,除非你对/proc/kmsg文件读取(实际上这项工作已被较早的dmesg命令完成)。当使用klogd时,你应该记住它不会保留重复的消息行;对于它接收到的重复消息,它只会保留第一条
|
dmesg应该可以看到
|
打印到日志中了。
输入dmesg可以查看
输入dmesg可以查看
|
dmesg
tail -n 100 /var/log/messages |grep 查看
tail -n 100 /var/log/messages |grep 查看
|
当日志级别小于console_loglevel时,消息才能显示出来,二楼资料很详细
另外,还有一个很方便的做法
就是重开一个控制台
cat /proc/kmsg
然后这个控制台可以用来显示内核日志
另外,还有一个很方便的做法
就是重开一个控制台
cat /proc/kmsg
然后这个控制台可以用来显示内核日志
|
下面两条命令都可以查看
dmesg
cat /var/log/messages
dmesg
cat /var/log/messages
|
printk()的第一个参数指明了trace输出的优先级别,你可以通过这里设置trace在哪里可输出
通常的做法是不用图形界面,直接加载驱动模块,这样在terminal里面就可见了
通常的做法是不用图形界面,直接加载驱动模块,这样在terminal里面就可见了
|
echo 8>/proc/sys/kernel/printk,修改系统默认的pritnk等级
|
dmesg
|
还需要看看你在编译内核的时候选没有选择支持 printk
|
如果输出信息级别没问题的话,应该可以用
dmesg | tail
看到