宏开关控制调试信息
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 */
其他也许还有更好的方法。
#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 */
其他也许还有更好的方法。
相关文章推荐
- 用signal实现调试信息的动态控制——syslog和signal
- 一键开关XCode调试打印信息
- JS开发中自定义调试信息开关
- 《游戏编程入门》学习笔记6——帧率控制、用文本显示调试信息
- xcode调试技巧(预处理器控制输出打印信息)
- 063.#IfDef 使用宏来控制调试信息
- C++ 用条件编译 控制开发过程中输出调试信息
- zen cart 打开错误信息显示调试开关
- C++ 用条件编译 控制开发过程中输出调试信息
- 063.#IfDef 使用宏来控制调试信息
- 如何在动态库中打印调试信息到控制台中显示
- [RK3288][Android6.0] 调试笔记 --- GPU DVFS的控制开关
- 控制调试信息的打印(printk,printf)
- 宏定义实现调试信息的打印控制
- Android源码开发----usb调试的开关以及系统配置信息
- WINCE6.0串口调试信息开关
- javascript获取鼠标坐标跟随控制层渐显信息提示效果(有BUG在调试中)
- linux操作学习05:用户信息文件,用户管理(useradd、userdel、groupadd、groupdel、id、usermod),用户权力下放(sudo),用户认证信息控制(chage)
- Vue父子组建的简单通信之控制开关Switch的实现
- 在ios iphone编程中使用封装的NSLog来打印调试信息