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