【问题标题】:Linux-kernel debug printouts?Linux内核调试打印输出?
【发布时间】:2011-06-26 21:06:39
【问题描述】:

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

现在乱扔代码:

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

这不是很干净。

应该有一种方法让整行成为#ifdef:ed 以某种不错的方式。

【问题讨论】:

  • 也许你可以看看this question
  • Kevin:谢谢,但这不是我想要的。我正在寻找一种处理实际调试打印输出的方法,而不是如何运行调试器。

标签: c debugging linux-kernel kernel printk


【解决方案1】:

使用

/* 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_() ":" 可以吗?我不需要调用 prinkt() 吗?
  • 您根本不需要重复模块名称。 pr_devel 调用 printk。拼写出来,#define pr_fmt(fmt) KBUILD_MODNAME ":" __FILE__ ":" __LINE__ ": " fmt,加上pr_devel("stuff and %p\n", somepointer)。
  • 我使用相同的语法,但在数字常量之前出现错误:错误:预期 ')' 我的代码中有这个:#define pr_fmt(fmt) KBUILD_MODNAME ":" __FILE__ ":" __LINE__ ": " fmt(在任何 #include 之前)和代码中pr_devel("XXX\n");
  • @brokenfoot:我知道这已经很老了,但我今天偶然发现了同样的问题,我找到了一个解决方案,让所有的文件名、函数和行号:#define pr_fmt(fmt) KBUILD_MODNAME ": " __FILE__ ", function %s, line %d: " fmt, __func__, __LINE__希望这个将来会帮助像我这样的任何谷歌员工。
  • 看看这里如何修复宏:stackoverflow.com/questions/36241433/…
【解决方案2】:

如果这是为了快速调试,只需 printk() 即可。

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

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

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    相关资源
    最近更新 更多