调试信息与普通信息不同,pr_XXX() 函数在任何条件下都会进行打印,而 pr_debug() 却不是,这些与调试有关的函数默认都不会被编译,除非你定义了一个 DEBUG 宏或者 CONFIG_DYNAMIC_DEBUG 宏来显式地让编译器编译他们。还有一个惯例就是使用 VERBOSE_DEBUG 为那些已经开启 DEBUG 的用户添加 dev_vdbg() 消息。 很...
#define dev_vdbg(dev, format, arg...) \({ \ if (0) \ dev_printk(KERN_DEBUG, dev, format, ##arg); \})#endif dev_printk定义:static void __dev_printk(const char *level, const struct device *dev, struct va_format *vaf){ if (dev) //带个前缀 dev_printk_emit(level[1] - '...
虽然其他 pr_XXX() 函数无条件打印,但 pr_debug() 不会;它默认编译出来,除非定义了 DEBUG 或设置了 CONFIG_DYNAMIC_DEBUG。dev_dbg() 也是如此,并且相关约定使用 VERBOSE_DEBUG 将 dev_vdbg() 消息添加到已由 DEBUG 启用的消息。 很多子系统都有Kconfig调试选项,可以在对应的Makefile中开启-DDEBUG;在其他情况...
当DEBUG符号没有被定义的时候,这些信息不应该被编译进内核里(也就是说,默认地,它们不应该被包含在内)。 如果你使用dev_dbg()或者pr_debug(),就能自动达到这个效果。 很多子系统拥有Kconfig选项来启用-DDEBUG。 还有一个相关的惯例是使用VERBOSE_DEBUG来添加dev_vdbg()消息到那些已经由DEBUG启用的消息之上。 第十...
然而打印调试信息的处理方式同打印非调试信息不同。其他 pr_XXX() 函数能无条件地打印,pr_debug() 却不;默认情况下它不会被编译,除非定义了 DEBUG 或设定了 CONFIG_DYNAMIC_DEBUG。实际这同样是为了 dev_dbg(),一个相关约定是在一 个已经开启了 DEBUG 时,使用 VERBOSE_DEBUG 来添加 dev_vdbg()。
然而打印调试信息的处理方式同打印非调试信息不同。其他 pr_XXX() 函数能无条件地打印,pr_debug() 却不;默认情况下它不会被编译,除非定义了 DEBUG 或设定了 CONFIG_DYNAMIC_DEBUG。实际这同样是为了 dev_dbg(),一个相关约定是在一 个已经开启了 DEBUG 时,使用 VERBOSE_DEBUG 来添加 dev_vdbg()。
当DEBUG符号没有被定义的时候,这些信息不应该被编译进内核里(也就是说,默认地,它们不应该被包含在内)。如果你使用dev_dbg()或者pr_debug(),就能自动达到这个效果。很多子系统拥有Kconfig选项来启用-DDEBUG。还有一个相关的惯例是使用VERBOSE_DEBUG来添加dev_vdbg()消息到那些已经由DEBUG启用的消息之上。
还有一个惯例是使用 VERBOSE_DEBUG 为那些已经开启 DEBUG 的用户添加 dev_vdbg() 消息。 章十四:内存分配 内核提供了下列通用内存分配器:kmalloc()、kzalloc()、kcalloc()、vmalloc()、和 vzalloc()。 更多信息,请参阅的 API 文档。 传递一个结构体大小的最好方式如下: ...
然而打印调试信息的处理方式同打印非调试信息不同。其他 pr_XXX() 函数能无条件地打印,pr_debug() 却不;默认情况下它不会被编译,除非定义了 DEBUG 或设定了 CONFIG_DYNAMIC_DEBUG。实际这同样是为了 dev_dbg(),一个相关约定是在一 个已经开启了 DEBUG 时,使用 VERBOSE_DEBUG 来添加 dev_vdbg()。
然而,调试消息打印与打印其他非调试消息的方式不同。其他pr_XXX()函数会无条件打印,而pr_debug()不会;默认情况下,它会被编译掉,除非定义了DEBUG或设置了CONFIG_DYNAMIC_DEBUG。dev_dbg()也是如此,相关的约定使用VERBOSE_DEBUG来添加dev_vdbg()消息,以补充已由DEBUG启用的消息。