优先顺序 - printk() vs dev_dbg() vs netdev_dbg() (注:此为提问标题,无需回答)

18

最近我在Linux源代码树中运行了scripts/checkpatch.pl脚本,并收到了以下警告:

WARNING: Prefer netdev_dbg(netdev, ... then dev_dbg(dev, ... then pr_debug(...  to printk(KERN_DEBUG ...
printk(KERN_DEBUG "Hello World! \n");

我知道pr_debug和dev_dbg提供的动态调试界面比printk有明显优势,因此它们比printk更受欢迎。即使在dev_dbg和pr_debug之间,如果我们有一个struct device来标准化设备信息输出和我们的调试消息,我们也更喜欢使用dev_dbg。它可以避免“编辑/重建/重新启动循环”,并且还允许通过dynamic_debug/control界面维护整洁的日志。

我的问题是:为什么netdev_dbg优先于dev_dbg?

1个回答

22

每个内核子系统通常都有自己的printk格式。因此,在使用网络子系统时,您必须使用netdev_dbg;在使用V4L时,您必须使用v4l_dbg。它标准化了子系统内的输出格式。

netdev_dbg不是绝对首选的打印样式。如果您正在使用网络设备,则建议使用它。如果您查看此处的源代码,您将看到需要一个struct netdevice对象,而只有在您在网络子系统中工作时才具有此类对象。

可能消息很混乱,因为它应该建议您使用所在子系统的打印方法。您收到警告是因为您正在使用prink()这是打印某些内容的原始方式。

根据您编写的内容不同,您应该使用不同的打印样式:

printk():永远不要使用

pr_debug():始终良好

dev_dbg():当您拥有一个struct device对象时首选

netdev_dbg():当您拥有一个struct netdevice对象时首选

[something]_dbg():当您拥有该something对象时首选


在这种情况下,我有两个问题:
  1. netdev_dbg相对于dev_dbg提供了什么“额外”的功能。
  2. 此警告消息中使用netdev_dbg()而不是subsystem_dbg()是否有原因。(我之所以问这个问题,是因为这条消息来自checkpatch.pl - 这是Linux中用于检查“所有”补丁的通用脚本。为什么它特别说netdev_dbg而不是其他东西?)
- Yogesh
1
请查看源代码和git历史记录 (1) 这是netdev_*()打印输出的内容 http://lxr.free-electrons.com/source/net/core/dev.c#L6717 (2.1) 8f26b8376faad26372a579606ecbd77b20e99dd8 是引入警告消息的补丁 (3) 我假设你正在处理一个网络设备,那么为什么不优先使用netdev_dbg()呢? (4) 如果你不是在处理网络设备,那么可能我们有问题。 - Federico
谢谢。我看到了1和2.1。我只是不确定为什么netdev_dbg比其他子系统的*_dbg调用更受欢迎(关于此消息)。至于(3)和(4),我并没有在netdevice上工作。事实上,您可以编写最简单的“hello world”模块(甚至不是设备驱动程序),并使用checkpatch.pl进行检查。这个警告消息会弹出。 - Yogesh
1
我改进了我的回答,请看一下。 - Federico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接