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.mzph.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搞定吧。 ---------------------------------------------------…