在调试Linux内核时,dev _ *()系列函数如何有用?

时间:2015-07-13 11:59:52

标签: c linux linux-kernel

在搜索调试Linux内核的技术时,其中一种方法是使用 dev _ *()系列函数。

这些功能在/include/linux/device.h文件中定义。

功能列表如下:

`dev_emerge()`<br>
`dev_alert()`<br>
`dev_crit()`<br>
`dev_err()`<br>
`dev_warning()`<br>
`dev_notice()`<br>
`dev_info()`<br>

我已经尝试过 pr _ *() [pr_emerge()pr_alert()pr_crit() ...]系列函数,它们类似于< 以某种方式强化> printk()

使用简单的内核模块进行实验,我将调用这些函数。此外,我还经历了syslogdmesg中显示的消息的优先级(内核环缓冲区取决于console_loglevel-内核变量)。

但我无法理解 dev _ *()系列的用法。我的意思是,我如何在程序中使用它来调试内核功能?

3 个答案:

答案 0 :(得分:6)

pr_*()函数与普通printk()相同,但已包含KERN_xxx日志级别。

dev_*()功能与相应的pr_*()功能相同,但也会打印有关struct device的识别信息。

如果您的消息与某些设备相关(通常在驱动程序中就是这种情况),则应使用dev_*()。 例如,在USB驱动程序中:

struct usb_device *usb_dev;
dev_info(&usb_dev->dev, "hello\n");

struct usb_interface *usb_intf;
dev_info(&usb_intf->dev, "hello\n");

或在PCI驱动程序中:

struct pci_dev *pci;
dev_info(&pci->dev, "hello\n");

答案 1 :(得分:1)

dev_*函数类似于pr_*,但也会打印一些有关设备(struct device)的信息,并将其作为第一个参数传递给它们。此信息可能有助于过滤属于具体设备的消息的系统日志。

因此,只要消息适用于具体设备,您就可以使用dev_*函数而不是pr_*。(并且您有它的描述符。)

答案 2 :(得分:1)

使用QEMU检查自己打印的内容

这是它为PCI设备打印的内容:

<6>lkmc_pci 0000:00:04.0: pci_probe

格式为:

<level><kernel-module> <pci-address>: <message>

正如其他人所说,与简单的printk相比,它提供了额外的设备信息,即:

  • 内核模块名称
  • PCI地址

我用QEMU的“edu”设备测试了这个设备,这是一种简单的教育PCI设备,我写了a minimal Linux kernel module

关键模块代码是:

static int pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
{   
    dev_info(&(dev->dev), "pci_probe\n");

字符设备显然不会显示struct device,因此您无法以这种方式进行测试:How do you get a struct device for a Linux character device