您的位置:首页 > 其它

宏开关控制调试信息

2013-01-22 14:36 162 查看
最近调试驱动,想把调试信息注册掉,一条一条删除或者添加挺麻烦,于是想加上调试信息开关,下面是搜罗的方法。

#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 */

其他也许还有更好的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: