如何用C语言设计类似gem5的debug功能?

How to design a debug function similar to gem5 in C language?

gem5中的调试信息真是厉害。 只需要在需要输出调试信息的地方使用DPRINTF(FLAGA,"%d",value);即可。

如果在编译的时候加上--debug-flag=FLAGADPRINTF(FLAGA,"%d",value); 会变成 printf("%d", value); 否则会变成 empty.

这是通过条件编译实现的。但是我不知道如何按照上面的FLAG进行编译。 我想到的是这样的:

#include<stdio.h>

#define NOOP //(void(0))

#undef DCOUT
#undef DPRINTF

#ifdef DEBUG_OUT
#define DPRINTF(...) printf(__VA_ARGS__)
#else 
#define DPRINTF(...) NOOP
#endif 

#undef DEBUG_OUT

我可以在某些地方使用 DPRINTF(),但所有调试信息都被保留或消失了。像gem5那样编译的时候不能保留在which option下吗?这句话的意思是我写了一些调试输出。

A(){
DPRINTF("DEBUGA", "%d",val1);
}
B(){
DPRINTF("DEBUGB", "%d", val2);
}

编译的时候,如果我加上--debugflag=DEBUGA.

`DPRINTF("DEBUGA","%d",val1);`   -->  `printf("%d",val1);`, 
`DPRINTF("DEBUGB", "%d", val2);   --> empty

编译的时候,如果我加上--debugflag=DEBUGB.

`DPRINTF("DEBUGA","%d",val1);`   --> empty, 
`DPRINTF("DEBUGB", "%d", val2);` -->`printf("%d",val2);.

有人可以给我一些建议吗?

不知道我有没有看懂。 但我猜你想要这个:

头文件:

#ifndef INCLUDE_GUARD_H
#define INCLUDE_GUARD_H

#ifdef DEBUG_OUT
#define DPRINTF(level, format, ...) DebugPrintf(level, format, __VA_ARGS__)
#else
#define DPRINTF(level, format, ...) ;
#endif

#define LEVEL_TRACE 1
#define LEVEL_DEBUG 2
#define LEVEL_ERROR 3
#define LEVEL_FATAL 4

extern int giLevel;

#endif

源文件:

int giLevel = LEVEL_DEBUG;

#ifdef DEBUG_OUT
void DebugPrintf(int level, const char *format, ...)
{
   if (level < giLevel) return;
   va_list marker;
   va_start(marker, format);
   vprintf(format, marker);
   va_end(marker);
}
#endif

通过带有选项 -DDEBUG_OUT 的 printf 编译使用日志进行编译。 您可以更改最低日志级别设置变量 giLevel

如果您想将其保存在文件中,请将函数 DebugPrintf 更改为使用 vfprintf

您也可以在DPRINTF原型中添加__LINE____FILE__来添加日志的位置。

否则,您可以在 Linux 或 cygwin 上使用像 rsyslog 这样的库。