Linux内核调试输出?

13

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

现在,代码里到处都是这样的打印语句:

printk(KERN_DBG "%s:%d - %s() <message>", __FILE__, __LINE__, __FUNCTION__ ); 

这不是很干净的方式。

应该有一种整行以一些好的方式进行 #ifdef 处理的方法。


也许你可以查看一下这个问题 - Kevin
Kevin:谢谢,但这不是我正在寻找的。我正在寻找一种处理实际调试输出的方法,而不是运行调试器的方法。 - user616128
2个回答

21
使用
/* 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");

作为基础(标准做法)。如果需要,您可以将__FILE____LINE__添加到pr_fmt定义中。


我理解这一部分的内容正确吗? pr_<arg>(<args>) <我的模块名称> ":" <printk args>这样行得通吗?我不需要调用printk()函数吗? - user616128
你不需要重复模块名称。pr_devel 调用 printk。具体来说,#define pr_fmt(fmt) KBUILD_MODNAME ":" __FILE__ ":" __LINE__ ": " fmt,再加上 pr_devel("stuff and %p\n", somepointer) - user611775
1
我使用相同的语法,但是出现了错误: 错误:数字常量之前应该有‘)’我的代码中有这个: #define pr_fmt(fmt) KBUILD_MODNAME ":" __FILE__ ":" __LINE__ ": " fmt (在任何#include之前) 并且在代码中 pr_devel("XXX\n"); - brokenfoot
@brokenfoot:我知道这个问题已经很老了,但今天我也遇到了同样的问题,并找到了一个解决方案,可以获得所有文件名、函数和行号:#define pr_fmt(fmt) KBUILD_MODNAME ": " __FILE__ ", function %s, line %d: " fmt, __func__, __LINE__ 希望这能帮助像我一样的谷歌搜索者在未来解决类似问题。 - theman
看这里如何修复宏:https://stackoverflow.com/questions/36241433/variadic-macro-expected-before-numeric-constant - matteolel

2
如果只是快速调试,使用printk()就可以了。
如果是在更严肃的生产环境下进行调试,可以考虑使用pr_debug(),这样消息可以在运行时启用。
无论如何,通常使用("%s: xxx", func)就足够了。这些文件名和行号很快就会变得烦人起来。这也是为什么你没有找到任何“标准”解决方案的原因--因为根本没有。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接