宏开关控制调试信息

来源:互联网 发布:淘宝如何抢到现货 编辑:程序博客网 时间:2024/04/30 04:11
最近调试驱动,想把调试信息注册掉,一条一条删除或者添加挺麻烦,于是想加上调试信息开关,下面是搜罗的方法。


#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 <stdarg.h>
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 */






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

  • 原创粉丝点击