在内核调试时通常要输出一些信息,这些信息的输出通常由一些宏来控制,下面列举内核中用到的几个宏:
1.1
这个宏定义为:
#ifdef DEBUG
#define pr_debug(fmt,arg...) \
#else
static int __attribute__ ((format (printf, 1, 2))) pr_debug(const char * fmt, ...)
{
}
#endif
要想输出pr_debug中的信息,首先要求定义DEBUG宏。此外由于它使用了KERN_DEBUG这一输出级别,还必须在内核参数中使用ignore_loglevel。再不然就直接修改pr_debug的定义!
和pr_debug在一起的还有一个叫pr_info的宏,这个宏总能输出信息:
#define pr_info(fmt,arg...) \
1.2
这个宏定义为:
#define dev_printk(level, dev, format, arg...) \
#ifdef DEBUG
#define dev_dbg(dev, format, arg...)
#else
static int __attribute__ ((format (printf, 2, 3)))
dev_dbg(struct device * dev, const char * fmt, ...)
{
}
#endif
同样,要想输出dev_dbg中的信息,首先要求定义DEBUG宏。此外由于它使用了KERN_DEBUG这一输出级别,还必须在内核参数中使用ignore_loglevel。再不然就直接修改它的定义!
使用这个宏的好处在于它可以输出驱动或者相关信息的名称:
const char *dev_driver_string(struct device *dev)
{
}
其实意义不是很大。
还有几个相似的宏:
#define dev_err(dev, format, arg...)
#define dev_info(dev, format, arg...)
#define dev_warn(dev, format, arg...)
#define dev_notice(dev, format, arg...)
只是其输出级别不一样而已。
1.3
这个宏没什么广泛影响,因为它只定义在个别的c文件里面,其影响只局限在它所在的.c文件。估计是dprintk这个名称比较受欢迎,所以拥有不少的fans。
比如在saa711x.c这个驱动中就是这样定义它的:
#define dprintk(num, format, args...) \
再想偷懒的就这样定义:
#if DEBUG > 1
#define dprintk
#else
#define dprintk(x...)
#endif