如何在C语言中设计一个类似gem5的调试函数?
gem5中的调试信息真是太棒了。 您只需要使用如何在C语言中设计一个类似gem5的调试函数?,c,gem5,C,Gem5,gem5中的调试信息真是太棒了。 您只需要使用DPRINTF(FLAGA,“%d”,value)输出调试信息的位置 如果在编译时添加--debug flag=FLAGADPRINTF(FLAGA,“%d”,value);将变成printf(“%d”,value)否则它将变为空 这是通过条件编译实现的。但我不知道如何根据上面的标志编译。 我想到的是: #include<stdio.h> #define NOOP //(void(0)) #undef DCOUT #undef DPR
DPRINTF(FLAGA,“%d”,value)代码>输出调试信息的位置
如果在编译时添加--debug flag=FLAGA
DPRINTF(FLAGA,“%d”,value);
将变成printf(“%d”,value)代码>否则它将变为空
这是通过条件编译实现的。但我不知道如何根据上面的标志编译。
我想到的是:
#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
编译时,如果我添加--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
#ifdef调试出
#定义DPRINTF(级别、格式等)调试打印F(级别、格式、参数)
#否则
#定义DPRINTF(级别、格式等);
#恩迪夫
#定义级别跟踪1
#定义调试2级
#定义第三级错误
#定义第4级
国际基里维尔外展;
#恩迪夫
源文件:
int giLevel=LEVEL\u调试;
#ifdef调试出
void DebugPrintf(整数级,常量字符*格式,…)
{
如果(电平<基电平)返回;
va_列表标记;
va_开始(标记、格式);
vprintf(格式、标记);
va_端(标记);
}
#恩迪夫
使用printf compile通过选项-DDEBUG\u OUT
使用日志进行编译。
您可以通过变量giLevel
如果要将其保存在文件中,请将函数DebugPrintf更改为使用vfprintf
您还可以在DPRINTF
原型中添加\uuuu行
和\uuuu文件
,以添加日志的位置
否则,您可以在Linux或cygwin上使用类似于rsyslog的库。我不知道是否理解。
但我想你想要这个:
头文件:
\ifndef包括
#定义INCLUDE_GUARD_H
#ifdef调试出
#定义DPRINTF(级别、格式等)调试打印F(级别、格式、参数)
#否则
#定义DPRINTF(级别、格式等);
#恩迪夫
#定义级别跟踪1
#定义调试2级
#定义第三级错误
#定义第4级
国际基里维尔外展;
#恩迪夫
源文件:
int giLevel=LEVEL\u调试;
#ifdef调试出
void DebugPrintf(整数级,常量字符*格式,…)
{
如果(电平<基电平)返回;
va_列表标记;
va_开始(标记、格式);
vprintf(格式、标记);
va_端(标记);
}
#恩迪夫
使用printf compile通过选项-DDEBUG\u OUT
使用日志进行编译。
您可以通过变量giLevel
如果要将其保存在文件中,请将函数DebugPrintf更改为使用vfprintf
您还可以在DPRINTF
原型中添加\uuuu行
和\uuuu文件
,以添加日志的位置
否则,您可以在Linux或cygwin上使用类似于rsyslog
的库。不能将其保留在哪个选项下。你能澄清一下你的意思吗?谢谢你的回复。我添加了一个解释。#定义DPRINTF(名称,格式,…)DPRINTF###名称(格式,参数)
然后创建每个要使用的DPRINTF xxx
,并调用DPRINTF(debuga,“%d”,val1)代码>,或者您忘记了空,只在代码中输入一个返回值来比较名称。您不应该在应用程序的日志版本中考虑性能问题。--debug flag
在gcc、msvc或clang中不存在,请使用-D
语法。它不能保留在哪个选项下。你能澄清一下你的意思吗?谢谢你的回复。我添加了一个解释。#定义DPRINTF(名称,格式,…)DPRINTF###名称(格式,参数)
然后创建每个要使用的DPRINTF xxx
,并调用DPRINTF(debuga,“%d”,val1)代码>,或者您忘记了空,只在代码中输入一个返回值来比较名称。您不应该在应用程序的日志版本中考虑性能问题。--debug flag
在gcc、msvc或clang中不存在,请使用-D
语法。谢谢。我想更清楚地理解#define的用法,但我在Google上只找到了最基本的用法,没有参数。在哪里可以找到关于#define parameters更详细的介绍?@cyj您可以查看gcc文档:。你需要知道的就是这些。如果您正在使用其他编译器,某些功能可能会有所不同,那么您将需要搜索其他功能。大部分都能用,谢谢。我想更清楚地理解#define的用法,但我在Google上只找到了最基本的用法,没有参数。在哪里可以找到关于#define parameters更详细的介绍?@cyj您可以查看gcc文档:。你需要知道的就是这些。如果您正在使用其他编译器,某些功能可能会有所不同,那么您将需要搜索其他功能。大部分都可以在任何地方使用。
`DPRINTF("DEBUGA","%d",val1);` --> empty,
`DPRINTF("DEBUGB", "%d", val2);` -->`printf("%d",val2);.