【问题标题】:printk not working for kernel debguggingprintk 不适用于内核调试
【发布时间】:2011-12-26 19:37:02
【问题描述】:

我在内核代码中加入了一些调试信息。 已经检查了 /var/log/messages、dmesg 并且那里没有这样的转储。 syslogd 正在机器上运行

我还将 /proc/sys/kernel/printk 更改为 8 4 1 7

知道可能是什么问题吗?

【问题讨论】:

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


    【解决方案1】:

    直到昨天,当我发现一些有趣的事情时,我都遇到了同样的问题。最近 linux 内核一直在采用 pr_** 代替 printk(3.5 版本及更高版本)。

    我尝试在 3.3 版本的内核上运行一个带有 printk 的基本模块程序,在 3.7 及更高版本上也是如此。

    前者工作正常。后来只是没有在 dmesg 或 /var/log/messages 上显示 printk。但是用 pr_info 宏替换 printk,完成了这项工作。(其他变体也有 pr_err、pr_notice 等,之前在 include/linux/kernel.h 中找到,现在移至 include/linux/printk.h)

    虽然 pr_** 宏已经很老了,但感谢发起上述更改的 Joe Perches 的活动,我们最好学习内核方法! (参考:pr_info()

    【讨论】:

      【解决方案2】:

      最简单的解释是你的printk() 没有被调用。

      保持简单,并在调试此问题时坚持检查dmesg(1) 输出——所有syslog(3) /var/log/messages 和基于控制台的输出都与消息的问题分开,甚至没有出现在内核的消息缓冲区。

      【讨论】:

      • 我将 prink() 放在核心调度程序例程 sched_fork()、normal_prio() 等中。它们都没有出现在 dmesg 中。你能建议一个在所有情况下都被调用的例程吗?只是想检查我重新编译的内核在我启动机器时是否被拾取
      • 哇,这是一种查看调度程序的昂贵方式。查看Documentation/scheduler/sched-stats.txt 以获取有关了解调度程序正在做什么的更便宜的方法的信息。 :) 如果您想看到更改后的内核启动并正常工作,我建议修改类似于init/main.cstart_kernel() 函数。它会在启动时唤醒所有不同的子系统。
      • 感谢您的评论。看起来我的方式很昂贵 文档/调度程序是更好的学习方式。不知何故,我怀疑我通过 dpkg -i 安装的重新编译的内核没有激活。如何验证这一点?我已经成功重启了机器并按照blog.avirtualhome.com/2010/11/06/…中提到的所有步骤进行操作
      • 检查你正在运行的内核中uname -a的构建日期——如果你使用的是你今天构建的内核,或者你使用的是发行版提供的内核,它会给你一个更好的主意核心。虽然您发现的那些说明看起来非常适合遵循 Ubuntu 内核开发,但感觉有点“沉重”——如果您不介意使用上游 kernel.org 内核,请查看 kernel-package(在某些Ubuntu 存储库)——使用起来要容易得多。
      • 感谢您的帮助。你能建议我任何轻量级的易于构建的内核吗?我想做一些关于调度程序修改的工作。我是内核开发的新手。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2015-11-29
      • 2013-02-13
      • 2014-11-29
      • 2018-07-18
      • 1970-01-01
      相关资源
      最近更新 更多