C Linux内核调试打印输出?

C Linux内核调试打印输出?,c,debugging,linux-kernel,kernel,printk,C,Debugging,Linux Kernel,Kernel,Printk,有没有更好的方法来调试Linux内核中的打印输出 现在,在代码中乱扔: printk(KERN_DBG "%s:%d - %s() <message>", __FILE__, __LINE__, __FUNCTION__ ); printk(内核DBG“%s:%d-%s()”、\uuuuuuu文件、\uuuuu行、\uuuuu函数); 这不是很干净 应该有一种方法可以很好地对整行进行编辑。使用 /* At the top of the file, before any incl

有没有更好的方法来调试Linux内核中的打印输出

现在,在代码中乱扔:

printk(KERN_DBG "%s:%d - %s() <message>", __FILE__, __LINE__, __FUNCTION__ ); 
printk(内核DBG“%s:%d-%s()”、\uuuuuuu文件、\uuuuu行、\uuuuu函数);
这不是很干净

应该有一种方法可以很好地对整行进行编辑。

使用

/* At the top of the file, before any includes */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/printk.h>

/* in code... */
pr_devel("foobar happened\n");
/*位于文件顶部,在任何包含之前*/
#定义pr_fmt(fmt)KBUILD_MODNAME:“fmt
#包括
/*在代码中*/
pr_devel(“foobar事件”);

作为基础(标准实践)。然后,如果需要,您可以将
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>或
添加到
pr\ufmt<

如果这是为了在更多的生产环境中进行调试,可以使用pr_debug(),以便在运行时启用消息


不管怎样,(%s:xxx),func)通常就足够了。这些文件名和行号很快就会变得烦人。这也是为什么你没有找到任何“标准”解决方案的原因,因为没有。

也许你可以看看凯文:谢谢,但这不是我想要的。我正在寻找一种处理实际调试打印输出的方法,而不是如何运行调试器。我是否正确理解这一点?pr_uz():“这样行吗?我不需要调用prinkt()吗?您根本不需要重复模块名。pr_devel打电话给printk。具体来说,
#define pr_fmt(fmt)KBUILD_MODNAME:“uu FILE_uuu”:“u LINE_uuu”:“fmt
,加上
pr_devel(“stuff和%p\n,somepointer)
。我使用了相同的语法,但我得到了一个错误:error:expected'),在数值常量之前,我的代码中有这个:
#define pr fmt(fmt)KBUILD_umodu名称“:”“fmt
(在任何“包含”之前)和代码
中(“XXX\n”)
@brokenfoot:我知道这已经很老了,但今天我偶然遇到了同样的问题,我找到了一个解决方案,可以获得所有文件名、函数和行号:
#define pr_fmt(fmt)KBUILD_MODNAME:“u file_u”,函数%s,行%d:“fmt,u func_u,_uuuline uuuu
希望这将对今后像我这样的谷歌用户有所帮助。来看看如何修复宏: