【问题标题】:About to print KERNEL messages on terminal即将在终端上打印 KERNEL 消息
【发布时间】:2013-04-15 03:09:36
【问题描述】:

根据手册页,它告诉如果消息的日志级别的优先级高于默认设置的日志级别,那么它将被打印在终端上。但是当我用过类似的句子时

printk(KERN_ALERT " MESSAGE ")

我在终端上打印消息时遇到问题。因为默认优先级设置为4,而KERN_ALERT的优先级为1,更高。

那么,如何在终端上打印消息?

【问题讨论】:

  • 在回答之前,我能问一下你为什么要这个吗?如果你想用它来调试,不要这样做。这仅适用于您想要在屏幕上打印某些内容的极其糟糕的情况。基本上只在电脑快要爆炸的时候。那你为什么需要这个?
  • 我正在驱动程序中进行编程。所以每次我必须做 dmesg 或检查 syslog 文件。如果它会在终端上打印消息,那么我们可以更快地通过 printk 进行调试。

标签: linux linux-kernel device-driver kernel-module kernel


【解决方案1】:

它应该将消息打印到控制台,而不是终端。有时控制台和终端看起来一样,但事实并非如此。编辑 /proc/sys/kernel/printk 设置在控制台打印的最低优先级

【讨论】:

  • 感谢您的回答,但此文件是可读文件。它没有写权限
  • 当你尝试写入时你是root吗?
  • -rw-r--r-- 1 root root 0 22 apr 11.43 /proc/sys/kernel/printk。通常,您必须是 root 才能编辑此文件
【解决方案2】:

我知道这并不能完全回答您的问题,但就像我在 cmets 中所说的那样,将 printk 登录到控制台通常不是一个好主意。这是我建议的另一种选择,它应该足以满足您的目的。

由于您想将其用于调试目的,您只需打开一个新终端并执行以下命令:

tail -f /var/log/messages

tail -f /var/log/dmesg

之类的。 tail -f 将打印文件中的最后一条消息,但会继续等待更新。一旦文件中写入了更多行,tail -f 就会将它们写入控制台。

无论您是使用此方法还是直接打印到控制台,您可能还对定义一个调用printk 的宏感兴趣,并且在调试模式下还会在后面加上一个小的msleep 以确保日志成功到屏幕,以防崩溃。这样做是这样的:

set_current_state(TASK_INTERRUPTIBLE);
msleep(/* amount in milliseconds */);

【讨论】:

  • 谢谢沙巴兹。除了认为“打印到控制台通常不是一个好主意”之外,我应该说不可能在控制台上打印内核消息吗??
  • 我不认为这是不可能。虽然这可能非常困难,更不用说它通常可能没有意义,因为您不一定通过终端加载模块。在启动期间,很容易在控制台中打印一些内容,正如您在启动消息中看到的那样。
  • printk 的手册页说:我们尝试获取 console_sem。如果我们成功了,这很容易——我们记录输出并调用控制台驱动程序。如果我们无法获取信号量,我们会将输出放入日志缓冲区并返回。 所以您可能还想了解为什么printk 可能无法获取console_sem
【解决方案3】:

我最初在主机系统上开发骨架驱动程序时遇到了同样的问题。每次我必须检查“dmesg”命令。

我必须编辑 /proc/sys/kernel/printk 。

用于使用窗口管理器(例如广告 KED 和 Gnome)在终端上获取消息 运行 "tail -f /var/log/kern.log &" 以在终端上获取消息。

它在 Ubuntu 系统中帮助了我。希望它会有所帮助:)

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2020-06-08
    • 1970-01-01
    • 2013-12-02
    • 2015-01-03
    • 2010-11-23
    • 2021-01-12
    • 2014-11-07
    • 1970-01-01
    相关资源
    最近更新 更多