当前位置:  技术问答>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 发布而变化). 

这句话如何理解?


|
输入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时,你应该记住它不会保留重复的消息行;对于它接收到的重复消息,它只会保留第一条

|
dmesg应该可以看到

|
打印到日志中了。
输入dmesg可以查看

|
dmesg 

tail -n 100 /var/log/messages |grep 查看

|
当日志级别小于console_loglevel时,消息才能显示出来,二楼资料很详细

另外,还有一个很方便的做法
就是重开一个控制台
cat /proc/kmsg
然后这个控制台可以用来显示内核日志

|
下面两条命令都可以查看
dmesg 
cat /var/log/messages

|
printk()的第一个参数指明了trace输出的优先级别,你可以通过这里设置trace在哪里可输出

通常的做法是不用图形界面,直接加载驱动模块,这样在terminal里面就可见了

|
 echo 8>/proc/sys/kernel/printk,修改系统默认的pritnk等级

|
dmesg

|
还需要看看你在编译内核的时候选没有选择支持 printk

|

如果输出信息级别没问题的话,应该可以用
dmesg | tail 
看到

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • [求助]indep_printk(char *fmt,...)重新封装了一下printk,可怎么出错呢?
  • 我的printk在ubuntu中没有输出,怎么回事?
  • printk的问题
  • 请教printk函数的问题
  • printf和printk的区别?
  • printk求助~~~
  • 请教printk问题
  • echo 8 > /proc/sys/kernel/printk
  • printk顯示問題
  • 在线等!大哥们,printk函数到底怎么看他输出的结果?马上给分
  • 请问printk怎么使用?
  • 请教关于syslogd和printk的几个问题
  • 高分相送 unresolved symbol printk 出错~,在线等待
  • 小问题:用printk如何直接打印出u64类型的大数??
  • printk日志打印问题、、、、??
  • printf和printk的诡异现象,有强人进来解释下的吗?
  • #define PCI9054_MSG(fmt, args...) printK("kERN_WARNING:"fmt,##args)
  • 大喝一声, 请问printk()是c中的函数吗?
  • printk打印无法在控制台显示出来
  • 请问能否将内核中的printk定向输出到一个指定的文件??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3