如何用C语言设计类似gem5的debug功能?
How to design a debug function similar to gem5 in C language?
gem5中的调试信息真是厉害。
只需要在需要输出调试信息的地方使用DPRINTF(FLAGA,"%d",value);
即可。
如果在编译的时候加上--debug-flag=FLAGA
。 DPRINTF(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
这样的库。
gem5中的调试信息真是厉害。
只需要在需要输出调试信息的地方使用DPRINTF(FLAGA,"%d",value);
即可。
如果在编译的时候加上--debug-flag=FLAGA
。 DPRINTF(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
这样的库。