我最近在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/