宏开关控制调试信息

最近调试驱动,想把调试信息注册掉,一条一条删除或者添加挺麻烦,于是想加上调试信息开关,下面是搜罗的方法。


#define  __DEBUG__     //宏开关


#ifdef __DEBUG__ //我的方法
#define DebugMessagePrint printk
#else
#define DebugMessagePrint /\                     //这里需要注意 \这个符号是向下换行,这一句就是宏定义为//DebugMessagePrint,其中必须用换行,否则就相当于注释了
/DebugMessagePrint

#endif

这一个方法可以用,但是由于使用 /\符号所以会有很多警告,warning: left-hand operand of comma expression has no effect

我的方法2:这种方法只能打印一句话,如printk("123");无法打印含有多个参数的信息

#ifdef CAMERA_DBG
#define CAMERA_TRACE(x) (printk)x
#else
#define CAMERA_TRACE(x)
#endif

所以采用改进方法


#ifdef __DEBUG__ //改进方法
#define DebugMessagePrint(fmt,args...) printk(fmt, ##args);
#else
#define DebugMessagePrint(fmt,args...) 
#endif

此方法可以打印多个变量,同时没有警告信息



#ifdef __DEBUG__ //方法1
#define DebugMessagePrint(flag) printf flag
#else
#define DebugMessagePrint(flag)
#endif


#ifdef __DEBUG__ //方法2
#include
void debug(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
}
#else
void debug(const char *fmt, ...)
{
}
#endif




#ifdef __DEBUG__//方法3
#define DbgPrintf printf//使用\换行符注释
#else
#define DbgPrintf /\
/DbgPrintf
#endif




#ifdef __DEBUG__//方法4
#define DBG(CODE) CODE
#else
#define DBG(CODE)
#endif




void main()
{
printf("正常0:%ds\n",time(NULL));


DebugMessagePrint(("方法1:%ds\n",time(NULL)));
debug("方法2:%ds\n",time(NULL));
DbgPrintf("方法3:%ds\n",time(NULL));
DBG(printf("方法4:%ds\n",time(NULL));)
}






可以运行上边的代码,查看具体的实现结果。


在Linux下,常用下边的宏来打印信息来定位


#ifdef __DEBUG__
#define DEBUGMSG()   printf("file:%s(%d),function:%s\n",__FILE__,__LINE__,__FUNCTION__)
#else
#define DEBUGMSG()
#endif




/ * *
  * 简单打印调试信息
  * /
#define DEBUG_SWITCH        1
#ifdef    DEBUG_SWITCH
#define pr_debug (fmt ,args . . . ) printf (fmt , ##args )
# else
#define pr_debug (fmt ,args . . . )  / * do  nothing  * /
#endif

/ * *
  * 错误信息打印
  * 自动打印发生错误时代码所在的位置
  * /
#define     ERR_DEBUG_SWITCH        1
#ifdef    ERR_DEBUG_SWITCH
#define pr_err (fmt ,args . . . ) printf ( "\nFile:<%s> Fun:[%s] Line:%d\n "fmt , __FILE__ , __FUNCTION__ , __LINE__ , ##args )
# else
#define pr_err (fmt ,args . . . )  / * do  nothing  * /
#endif

/ * *
  * 断言
  * 对某种假设条件进行检查 (若条件成立则无动作,否则报告错误信息 )
  * /
#define _EXAM_ASSERT_TEST_        1
#define _EXAM_ASSERT_EXIT_        1
#ifdef _EXAM_ASSERT_TEST_  / / 若使用断言测试
void exam_assert ( int condition ,  const char  * file_name ,  const char  *fun , unsigned  int line_no ,  const char  *fmt ,  . . . )
{
    char sBuf [1024 ] ;
    va_list va ;

     if  ( !condition )
     {
        bzero (sBuf , sizeof (sBuf ) ) ;
        va_start (va , fmt ) ;
        vsprintf (sBuf , fmt , va ) ;

        printf ( "\n[EXAM]Assert failed: File:<%s> Fun:[%s] Line:%d\n %s" , file_name , fun , line_no , sBuf ) ;
#ifdef _EXAM_ASSERT_EXIT_
        abort ( ) ;
#endif
     }
}

#define EXAM_ASSERT (condition , fmt , args . . . )    exam_assert (condition , __FILE__ , __FUNCTION__ , __LINE__ ,fmt , ##args )

# else  / / 若不使用断言测试
#define EXAM_ASSERT (condition , fmt , args . . . )  NULL
#endif  / *  end of ASSERT  * /






其他也许还有更好的方法。

你可能感兴趣的:(嵌入式linux)