问题描述
gem5 中的调试信息真的很神奇。
您只需要在要输出调试信息的地方使用 DPRINTF(FLAGA,"%d",value);
。
如果在编译时添加 --debug-flag=FLAGA
。 DPRINTF(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
之类的库。