如何在C语言中设计一个类似于gem5的调试功能?

问题描述

gem5 中的调试信息真的很神奇。 您只需要在要输出调试信息的地方使用 DPRINTF(FLAGA,"%d",value);

如果在编译时添加 --debug-flag=FLAGADPRINTF(FLAGA,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一样编译的时候不能保持在哪个选项下?这句话的意思是我写了一些调试输出

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

编译时,如果添加--debugflag=DEBUGA

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

编译时,如果添加--debugflag=DEBUGB

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

有人能给我一些建议吗?

解决方法

我不知道我是否理解。 但我想你想要这个:

头文件:

#ifndef INCLUDE_GUARD_H
#define INCLUDE_GUARD_H

#ifdef DEBUG_OUT
#define DPRINTF(level,format,...) DebugPrintf(level,__VA_ARGS__)
#else
#define DPRINTF(level,...) ;
#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

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

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

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

否则,您可以在 Linux 或 cygwin 上使用 rsyslog 之类的库。