What I write, what I lost.
对于依靠打印来作debug的主要手段的, 能够区分打印中的debug信息和error信息便显得非常重要.
原文的介绍有一篇关于控制台颜色的文章http://www.ibm.com/developerworks/cn/linux/l-tip-prompt/tip01/
有定义实现各种颜色的方式.
以此为基础, 方式挺有用的.
贴一段之前的使用的debug宏定义.
debug的等级分为
info(关键步骤的打印.)
debug(调试用的打印.)
data(具体调试的时候打开的开关.)
api(函数进出的打印.)
warning(警告的打印. 通常用于程序已经出错, 但是不想程序就此终止.)
error(错误的打印. 程序发生错误. 可能是系统的, 可能是程序错误.)
fatal(严重的错误. 此时程序终止是最好的反应.)
主要想法是在程序输出众多的打印中, 能使用颜色区分开关键性的信息.
#define __FILENAME__ ((strrchr(__FILE__, '/') == NULL)?__FILE__:((strrchr(__FILE__, '/') + 1)))#define COLOUR_INFO(x) x #define COLOUR_DEBUG(x) "\e[34;2m"x"\e[0m" #define COLOUR_DATA(x) "\e[34;1m"x"\e[0m" #define COLOUR_API(x) "\e[34;1m"x"\e[0m" #define COLOUR_WARNING(x) "\e[36;1m"x"\e[0m" #define COLOUR_ERROR(x) "\e[31;1m"x"\e[0m" #define COLOUR_FATAL(x) "\e[31;1m"x"\e[0m"#define DBG_FLAG_INFO 1<<1 #define DBG_FLAG_DEBUG 1<<2 #define DBG_FLAG_DATA 1<<3 #define DBG_FLAG_API 1<<4 #define DBG_FLAG_WARNING 1<<5 #define DBG_FLAG_ERROR 1<<6 #define DBG_FLAG_FATAL 1<<7#define DBG_FLAG_MODULE (DBG_FLAG_INFO | DBG_FLAG_DEBUG | DBG_FLAG_WARNING | DBG_FLAG_ERROR | DBG_FLAG_FATAL)#define DBGPRINTF_INFO(x...) \ do\ {\if(DBG_FLAG_INFO & DBG_FLAG_MODULE)\{\P_PRINTF(COLOUR_INFO("[%20.20s,%36.36s][%6d][ Info: ] "), __FILENAME__, __FUNCTION__, __LINE__); P_PRINTF(x);\}\ }while(0)#define DBGPRINTF_DEBUG(x...) \ do\ {\if(DBG_FLAG_DEBUG & DBG_FLAG_MODULE)\{\P_PRINTF(COLOUR_DEBUG("[%20.20s,%36.36s][%6d][ Debug: ] "), __FILENAME__, __FUNCTION__, __LINE__); P_PRINTF(x);\}\ }while(0)#define DBGPRINTF_DATA(x...) \ do\ {\if(DBG_FLAG_DATA & DBG_FLAG_MODULE)\{\P_PRINTF(COLOUR_DATA("[%20.20s,%36.36s][%6d][ Data: ] "), __FILENAME__, __FUNCTION__, __LINE__); P_PRINTF(x);\}\ }while(0)#define DBGPRINTF_API(x...) \ do\ {\if(DBG_FLAG_API & DBG_FLAG_MODULE)\{\P_PRINTF(COLOUR_API("[%20.20s,%36.36s][%6d][ Api: ] "), __FILENAME__, __FUNCTION__, __LINE__); P_PRINTF(x);\}\ }while(0)#define DBGPRINTF_WARNING(x...) \ do\ {\if(DBG_FLAG_WARNING & DBG_FLAG_MODULE)\{\P_PRINTF(COLOUR_WARNING("[%20.20s,%36.36s][%6d][Warning:] "), __FILENAME__, __FUNCTION__, __LINE__); P_PRINTF(x);\}\ }while(0)#define DBGPRINTF_ERROR(x...) \ do\ {\if(DBG_FLAG_ERROR & DBG_FLAG_MODULE)\{\P_PRINTF(COLOUR_ERROR("[%20.20s,%36.36s][%6d][ Error: ] "), __FILENAME__, __FUNCTION__, __LINE__); P_PRINTF(x);\}\ }while(0)#define DBGPRINTF_FATAL(x...) \ do\ {\if(DBG_FLAG_FATAL & DBG_FLAG_MODULE)\{\P_PRINTF(COLOUR_FATAL("[%20.20s,%36.36s][%6d][ Fatal: ] "), __FILENAME__, __FUNCTION__, __LINE__); P_PRINTF(x);\}\ }while(0)
DBGPRINTF_XXX 都可以在有些环境下换成printf直接使用.
当使用调试模式的时候, 可以根据不同的打印级别, 打印出不同的颜色.
扩展: 1.加上动态控制打印级别的API. 比如某些文件需要不同的打印级别.
2.加上所属线程. (对多线程程序有些作用).
3.加上时间标签.
如果使用gettimeofday不知道时候会降低系统效率. 更严重的是可能在多线程环境下打乱时序.
另外便是在ubuntu环境下发现 printf 和 gettimeofday交替使用的时候造成程序阻塞在gettimeofday. 实在是奇怪.
赶脚高手们应用程序少用debug打印的, 使用gdb才是王道.
什么时候成为gdb高手最好啦.
另外个人感觉, 良好的编程习惯和好的基础知识. 可以让你避免碰到那些低级的bug.
是么.
谢谢.