自定义Trace Trace0 Trace1… ASSERT 调试宏

来源:互联网 发布:淘宝排查实际控制人 编辑:程序博客网 时间:2024/04/29 11:17

MFC 中的TRACE开头的宏和ASSERT 用起来挺爽的,可是到了Console 和 Win32下就不好使了,今天正好有雅兴自己也弄几个这样的宏,方便今后使用。

 

需要实现的功能有以下几点:

1.支持格式化输出,如Trace0(“%d,%s…)。

2.支持序列化输出,如Trace(0,”abc”<<10<<20.0f<

3.可以设置最高输出等级。例如设置最高输出等级为2,在程序调试过程中只有等级<=2的函数(Trace0,Trace1,Trace2)才可以输出调试信息。

4.支持ASSERT断言宏

5.可以设置输出到日志文件、控制台和调试窗口多种方式。

6.支持多线程。

 

定义个类来封装下这些功能吧:

  

主要的几个函数:

1.BeginTrace 函数:

跟据配置信息打印各类初始化信息,同时对线程进行加锁。

2.TraceFormat 函数,实现格式化输出:

由va_list va_start va_end vsprintf 这系列宏和函数对可变参数进行解析,将格式化的的字符串追加到m_cbTraceBuffer 中。

3.重载 “<<” 操作符的函数,找几个函数来说明一下吧:

将传入的数据通过_snprintf 函数格式化后追加到m_cbTraceBuffer 中,下面是数值型的两个函数:

通过实现C++ 每个基本数据类型“<<”操作符重载后,就可以对每个基本数据类型的数据进行序列化操作了。

4.EndTrace 函数

跟据配置信息打印 m_cbTraceBuffer 中的数据,重置数据下次使用,并对线程解锁。

5.AssertFail 断言失败处理函数

处理断言失败,弹出类似于MFC 中的断言框,不过上面的文字是中文的。^_^

DebugTrace 类使用方法和Trace,Assert 宏的定义:

通过上面的代码不难看出来要打印一条信息最主要的几步是先调用下BeginTrace 函数,然后调用TraceFormat 或者重载“<<”操作符的函数,将数据依次追加到 m_cbTraceBuffer  中。最终调用EndTrace 将m_cbTraceBuffer 中的数据打印出来,下面看下如何将这一系列操作定义成一个宏。

1.实现支持格式化输出的宏,如Trace0(“%d,%s…) 。

2.实现支持序列化输出,如Trace(0,<<”abc”<<10<<20.0f<<5);
3.实现支持ASSERT断言宏

 

总结下吧:

CDebugTrace 类需要在工程中定义成全局变量来方便使用,并确保在调用到的cpp中“extern” 了全局变量。需要注意的是所有的字符操作都是调用ANSI 版的函数完成的,所以在使用的过程中不要出现“Trace0(TEXT(“%d,%s”),2,…);”或 “Trace0(_T(“%d,%s”),2,_T(“test”));”带有“TEXT”和“_T”宏的使用方式。

原创粉丝点击