如何从c代码中删除所有调试printf语句

时间:2012-01-05 12:09:39

标签: c linux embedded

我想从我的代码中删除所有调试printf语句。如何在不使用条件调试的情况下通过打开/关闭调试语句来执行此操作?

Iam使用printf来检查特定值是否正在变弱......如下所示......:printf(“value read%d \ n”,a);

6 个答案:

答案 0 :(得分:15)

如果不使用编辑器删除它们,就无法做到这一点。

你能做的是:

Allen Holub在他的book推荐 使用以下调试宏:

#ifdef DEBUG
#  define D(x) x
#else
#  define D(x) 
#endif

并像这样使用它:

D(printf("oh, hai, debug"));

答案 1 :(得分:2)

您应该解释如何进行调试printf。一个简单的方法就是拥有像

这样的宏
bool debug_flag; // to be set in the debugger or at initialization
pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER;
#define debugprintf(Fmt,...) debugprintf_at(__FILE__,__LINE__,Fmt,__VA_ARGS__)
#ifndef NDEBUG
#define debugprintf_at(Fil,Lin,Fmt,...) do {if (debug_flag) {       \
  pthread_mutex_lock(&debug_mutex);                                 \
  fprintf (stderr, "%s:%d %s:" Fmt, Fil, Lin, __func__,             \
         ##__VA_ARGS__);                                            \
  pthread_mutex_unlock(&debug_mutex); }                             \
} while(0)
#else
#define debugprintf(Fmt,...) do {} while(0)
#endif

(它使用互斥锁,因为您不希望混合来自不同线程的调试printf消息;如果您不使用任何线程,请删除互斥锁及其锁定。)

如果您的问题是如何在一个庞大的软件中找到所有调试printf(有源代码),您可以尝试使用grep或更多更好的东西,如GCC插件或MELT 延期。但是这样的方法(GCC定制)需要花费时间(一周或更多的工作),并且仅适用于庞大的软件基础(例如数百万行来源)。

对于不太大的软件,只需手动检查代码中的所有printf,并用debugprintf宏调用替换您认为用于调试的那些。

答案 2 :(得分:1)

替换printf()的所有DEBUG()次来电。 DEBUG 是一个定义为:

的宏
#define DEBUG printf

将调用真正的printf()函数,或者您也可以将其定义为:

#define DEBUG fake_printf
然后

将调用伪printf 来抑制调试信息。

假printf 功能可能如下:

int fake_printf( const char * format, ... )
{
    return 0;
}

答案 3 :(得分:0)

在visual studio中,如果printf在一行上,您可以使用Regex find / replace来删除printf语句。好吧,这将是非常费力但可能会奏效。

或者,编写另一个控制台应用程序来解析您的代码并为您执行此操作(然后您可以处理多行语句)。

关于调试日志记录的一个好模式是用全局函数或宏替换整个代码中的printf语句并调用它。例如,如果您有一个全局Log(const char * message)函数(或宏),如果您想要更改日志操作的方式,则可以更改该实现一次,而不是使用预处理器语句丢弃代码。

更进一步,有许多logging frameworks(和here)执行相同的操作,但具有更多的可配置性。

答案 4 :(得分:0)

这是我使用的方法:

#if !defined ( NDEBUG )
    void PrintMsg( const char_t* pFormat, ... )
    {
        va_list args;
        va_start( args, pFormat );
        (void)vprintf( pFormat, args );
        va_end( args );
    }
#else
    void PrintMsg( const char_t*, ... )
    {
    }
#endif


#define DBG_PRINTF      PrintMsg

然后将代码中的所有“printf”替换为“DBG_PRINTF”

它还将执行printf函数的参数。

答案 5 :(得分:-1)

不确定这是不是问题。我个人喜欢为调试信息提供单独的函数/宏,它使用预处理器指令启用。 如果你想从生产代码中删除调试输出......想不出任何自动化方式