OTR-Linux控制臺打印顏色區分.

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

謝謝.

?

?

?

轉載于:https://www.cnblogs.com/freezee/archive/2012/06/06/printf.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377471.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377471.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377471.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c#異常處理_C#中的異常處理

c#異常處理What an exception is? 有什么例外&#xff1f; An exception is a runtime error; that means an abnormal situation which is created at run time and the program doesn’t execute successfully. Due to the exceptions, our program gets crash. 異常是運行…

(轉)走進AngularJs(六) 服務

原文地址&#xff1a;http://www.cnblogs.com/lvdabao/p/3464015.html 今天學習了一下ng的service機制&#xff0c;作為ng的基本知識之一&#xff0c;有必要做一個了解&#xff0c;在此做個筆記記錄一下。 一、認識服務&#xff08;service&#xff09; 服務這個概念其實并不陌…

Linux驅動程序框架以及概述

目錄驅動程序三種基本類型&#xff08;組成&#xff09;設備驅動程序功能驅動程序的內核模塊機制&#xff08;開發模式&#xff09;驅動程序框架三個主要部分1、字符設備驅動程序框架2、塊設備驅動程序框架2、網絡設備驅動程序框架驅動程序三種基本類型&#xff08;組成&#x…

curl 使用整理(轉載)

我一向以為&#xff0c;curl只是一個編程用的函數庫。 最近才發現&#xff0c;這個命令本身&#xff0c;就是一個無比有用的網站開發工具&#xff0c;請看我整理的它的用法。 curl網站開發指南 阮一峰 整理 curl是一種命令行工具&#xff0c;作用是發出網絡請求&#xff0c;然…

Linux內核邏輯結構

linux內核從邏輯上可以分為5個部分&#xff1a; 1、進程調度 進程調度控制進程對CPU的訪問。當需要選擇下一個進程運行時&#xff0c;由調度程序選擇最值得運行的程序。可運行進程實際上是僅等待CPU資源的進程&#xff0c;如果某個進程在等待其他資源&#xff0c;則該進程是不可…

對批量文件重命名

一、 文件夾下存放各種不同名稱的同類型文件 F:\test 二、重命名格式從a0開始&#xff0c;數字依次遞增&#xff0c;a0,a1,a2,a3… import ospathr"F:\test"#要修改文件的路徑 namer"a"#命名從什么開始 num0#默認從0開始&#xff0c;即a0,a1,a2...... …

替換Quartus 自帶編輯器 (轉COM張)

正文 此處以Quartus II 11.1和Notepad v5.9.6.2為例。 1. 使用QII自動調用Notepad來打開HDL、sdc、txt等文件&#xff1b;并且可以在報錯的時候&#xff0c;Notepad可以直接高亮所報錯的行&#xff08;此模式下&#xff0c;Notepad最大化后效果最佳&#xff09;。 方法&#xf…

scala 方法重載_Scala中的方法重載

scala 方法重載Scala方法重載 (Scala method overloading) Method overloading is a method that is redefined in different ways under the same name. Method overloading is one of the methods used to implement polymorphism in Scala. 方法重載是一種使用相同名稱以不…

C#網頁自動登錄和提交POST信息的多種方法 新人學習中

網頁自動登錄和提交POST信息的核心就是分析網頁的源代碼&#xff08;HTML&#xff09;&#xff0c;在C#中&#xff0c;可以用來提取網頁HTML的組件比較多&#xff0c;常用的用WebBrowser、WebClient、HttpWebRequest這三個。 以下就分別用這三種方法來實現&#xff1a;1、WebBr…

四、采集和制作數據集

一、采集數據 安裝labelme&#xff1a;pip install labelme 打開labelme&#xff1a;labelme 將收集好的照片(320320&#xff0c;png格式)存放到一個文件夾中&#xff0c;例如我的是F:\test&#xff0c;再此文件夾下再創建個文件夾label用于存放標簽文件 使用labelme打開數據…

MTFBWU的完整形式是什么?

MTFBWU&#xff1a;愿力量與您同在 (MTFBWU: May The Force Be With You) MTFBWU is an abbreviation of “May The Force Be With You". MTFBWU是“愿力量與你同在”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media n…

VMware14.0 安裝 CentOS7.2

大致流程 對于VMware14.0安裝包用百度網盤下載即可。 鏈接&#xff1a;https://pan.baidu.com/s/1DEGa47EbI1Fup_MTXhv0xg 提取碼&#xff1a;izo6 華為云CentOS7 下載劃線的。其他步驟與大致流程里一樣。 最后輸入root 以及配置的密碼即可&#xff1a;密碼輸入時是沒有任何顯…

基于visual Studio2013解決C語言競賽題之1049抓牌排序

&#xfeff;&#xfeff;&#xfeff;&#xfeff;&#xfeff;&#xfeff;題目解決代碼及點評/* 功能&#xff1a;插入排序。許多玩牌的人是以這樣的方式來對他們手中的牌進行排序的&#xff1a;設手中原有3張牌已排好序&#xff0c;抓1張新牌&#xff0c;若這張新牌的次序在…

學習Lucene筆記一:創建索引

public class HelloLucene {/*** 建立索引* param args*/public void index(){IndexWriter writer null; try {//1.創建Directory,// Directory directory new RAMDirectory();//索引是建立在內存中的Directory directory FSDirectory.open(new File("D:/Lucene/ind…

【C++進階】C++創建文件/屏幕輸出流類(將信息同時輸出到文件和屏幕)

在軟件的調試技術中&#xff0c;很重要的一個技術是將軟件運行過程中的一些信息寫入到“日志文件”中。但是同時還要將信息顯示到屏幕上&#xff0c;以方便程序員實時查看這些信息。 最簡單的一種辦法是這樣的&#xff1a; std::ofstream output("debug.log", ios::…

五、加載數據集

之前寫過加載數據集的一些小筆記&#xff0c;這里詳細內容就不再敘述了 詳細學習可以參考該博文二、PyTorch加載數據 一、分析 因為U-net網絡架構是輸入1通道&#xff0c;大小為(572,572)的灰度圖&#xff0c;圖片大小無所謂&#xff0c;我的思路是將三通道的圖像使用OpenCV進…

CDMA的完整形式是什么?

CDMA&#xff1a;碼分多址 (CDMA: Code Division Multiple Access) CDMA is an abbreviation of Code Division Multiple Access. Code Division Multiple Access is a digital cellular technology and displays a network of multiple accesses. The various radio communica…

BCD碼與十進制的相互轉換

BCD碼是用每四位代替一位十進制數&#xff08;0 到 9 的某一位數&#xff09; 例如&#xff1a;0x25 就代表25 十六進制的每位轉換成二進制代表四個位。 下面是bcd轉char short int long c語言程序 //************************************************************…

DSP關于存儲器讀寫、IO讀寫時序圖的注意點

這里的存儲器圖不涉及插入等待周期。 IO設備的圖可以自行減去插入等待周期&#xff0c;然后觀察。 存儲器讀讀寫 存儲器寫寫讀 I/O設備讀寫操作

折騰430 launchpad

launchpad到手也已經很長時間了&#xff0c;團購了一個g2的&#xff0c;一個鐵電的&#xff0c;現在馬上又要來一個g2的&#xff0c;感覺手上的東西太多了&#xff0c;急需消化一下&#xff0c;首先呢還是先把430搞定吧。 ---------------------------------------------------…