我最近在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提供的动态调试接口(interface)对printk具有明显的优势,因此它们是printk的首选。

即使在dev_dbg和pr_debug中,如果我们有一个struct device来标准化设备信息输出和我们的debug消息,我们还是更喜欢dev_dbg。它提供了“编辑/重建/重新启动周期”的转义,并且还允许通过dynamic_debug/control接口(interface)维护整洁的日志。

我的问题是:
为什么netdev_dbg比dev_dbg更受青睐?

最佳答案

每个内核子系统通常都有自己的printk格式。因此,当您使用网络子系统时,必须使用netdev_dbg;使用V4L时,必须使用v4l_dbg。它将子系统内的输出格式标准化。
netdev_dbg不是绝对首选的打印样式。如果您正在使用网络设备,则首选使用它。如果查看源代码here,您会发现它是struct netdevice对象所必需的,并且只有在网络子系统中工作时才具有这种对象。

该消息可能是困惑的,因为它会建议您使用正在处理的子系统的打印方法。之所以收到警告,是因为您使用的是prink(),这是打印某些内容的原始方法。

根据您要编码的内容,您应该使用其他打印样式:
printk():从不
pr_debug():总是很好
dev_dbg():拥有struct device对象时首选
netdev_dbg():拥有struct netdevice对象时首选
[something]_dbg():当您拥有that something对象时,首选

关于linux - 优先顺序-printk()vs dev_dbg()vs netdev_dbg(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22077540/

10-11 21:26