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.
是么.

谢谢.

 

 

 

相关文章:

  • 2022-12-23
  • 2021-06-29
  • 2022-12-23
  • 2022-01-30
  • 2022-12-23
  • 2022-02-03
  • 2021-06-24
猜你喜欢
  • 2022-12-23
  • 2022-01-08
  • 2022-12-23
  • 2021-12-10
  • 2021-06-05
  • 2021-04-22
相关资源
相似解决方案