轻松打印详细的调试输出?

时间:2009-01-21 18:48:14

标签: c++ debugging

我基本上正在寻找一种自动输入内容的方法,如下所示:

cout << "a[" << x << "][" << y << "] =\t" << a[x][y] << endl;

类似的东西:

PRINTDBG(a[x][y]);

理想情况下,这也适用于

PRINTDBG(func(arg1, arg2));

甚至

PRINTDBG(if(condition) func(foo););

(将打印例如“if(false)func(5)”)。

非便携式黑客也欢迎:)

(不,使用调试器不一样,它的灵活性要差得多,我发现它很混乱)

5 个答案:

答案 0 :(得分:2)

这是printf样式输出可以更简洁的区域:

cout << "a[" << x << "][" << y << "] =\t" << a[x][y] << endl;
printf("a[%d][%d] =\t%d\n", x, y, a[x][y]);

当然,这仅限于printf理解的类型,但仍然无法解决您的问题。

我觉得Boost中的表达式分解技术可能有一些有价值的东西,但我还不足以识别模板忍者。

更新:以下几乎解决了您的问题:

#define PRINTDBG(x) cout << #x << " =\t" << x << endl;

但是,当用作PRINTDBG(a[x][y])时,它会打印出来:

a[x][y] = 5

未提供xy的实际值。

答案 1 :(得分:2)

这是你想要的方式,不可能。如果你给宏指定了 if(condition)func(foo); ,它可以对那些东西进行字符串化,它会打印 if(condition)func(foo); ,但不是替换变量的实际值。请记住,预处理器不了解该代码的结构。

对于调试,我会使用一些类型安全的printf变体,如boost.format或一些家庭酿造printf with boost.fusion,这使得打印这样的东西更容易:

dprintf("a[%][%] = %", (x, y, a[x][y]));

答案 2 :(得分:0)

我通常使用简单但可自定义的记录器功能而不是宏


Log(const char *format, ...)
{
    char buffer[MAX_BUFFER_SIZE];
    va_list args;

    //get arguements into a list
    va_start(args, format);

    //printf formated arguement into a string
    vsnprintf(buffer, sizeof(buffer), format, args);

    va_end(args);

    printf("%s", buffer);
  }

所以现在你可以做到

Log("a[%d][%d] =\t%d\n", x, y, a[x][y])
Log("if(%s) func(%d) ;", (condition) ? "true" : "False", func(foo))

将一些loggingtype(即LOG_SCREEN,LOG_FILE)添加到函数Log()中,现在您可以控制记录到哪里

添加一些logginglevel(即WARN,CRIT)来控制它的显示方式,颜色等。

当然,有很多很多图书馆已经完成了所有类型的工作

希望这会有所帮助

答案 3 :(得分:0)

在与Greg发布的不同方向略有扩展时,我看到了一些看起来像这样的好C程序

#DEFINE DEBUG_MODE 1
//...
if( DEBUG_MODE)
  printf("methodX() says: y=%i, var1=%i", y, var1);

但是你的程序中仍然有大量的printf,但至少你可以随时打开和关闭它们。

答案 4 :(得分:0)

您可以为自定义类定义运算符«因此您只需要定义一次格式:

struct point3 {
      int x,y,z;
      point3(int a, int b, int c){x=a;y=b;z=c;}
};

std::ostream& operator << (std::ostream& os, const point3& f) {
      return os << "(" << f.x << "," << f.y << "," << f.z << ")";
}

point3 p(1,2,3);
std::cout << p; // prints "(1,2,3)"

这很适合将cout或clog重定向到文件(不记得std :: clog是如何工作的)

#include <iostream>
#include <fstream>

int main() {
      std::ofstream file("log.txt");
      std::streambuf *filebuf = file.rdbuf();
      std::cout.rdbuf(filebuf);

      std::cout << "This is written to the file";

      filestr.close();
      return 0;
}