⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 debugtrace.h

📁 mysee网络直播源代码Mysee Lite是Mysee独立研发的网络视频流媒体播放系统。在应有了P2P技术和一系列先进流媒体技术之后
💻 H
字号:
/*
 *  Openmysee
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
// $_FILEHEADER_BEGIN ****************************
// 版权声明: 
//            北京新浪信息技术有限公司版权所有
//            Copyright (C) Sina Corporation. All Rights Reserved
//           
// 文件名称: DebugTrace.h
// 创建日期: 2005-04-04
// 创 建 人: 张宏涛
// 文件说明: 用于程序调试的宏定义,主要包括ASSERT和TRACE语句
/*
对外接口函数说明:

	//断言函数.若传入参数不为true则出现断言失败对话框, 并终止程序运行;
	//发行版中则什么也不做
	//eg:  ASSERT(apStrVal != NULL);	
1、void ASSERT(bool) 
	
	//记录日志 level为日志等级,args为日志内容	
	//eg:  RecordLog(1,"姓名:" << lszName<<"年龄:"<< 26 << "性别" << true);	
	//TRACE在发行版中为空函数
2、void TRACE/RecordLog(level, args) 
	
	//打印调试信息(0-6表示调试信息的级别,0级最高),发行版中什么也不做
	//eg:TRACE2("姓名:%s,年龄:%d,性别:%d",lszName,26,true);
3、TRACE0 - TRACE6	

	//设置打印日值的级别(静态函数)
4、	void CDebugTrace::SetTraceLevel(int aiTraceLevel);
	
	//设置日志文件名(静态函数)
5、	void CDebugTrace::SetLogFileName(char *aszLogFile);
	
	// 设置TRACE选项 .注意函数可以 OR 各选项(静态函数)
6、	void CDebugTrace::SetTraceOptions(unsigned options);

	//取得TRACE选项(静态函数)
7、	unsigned CDebugTrace::GetTraceOptions(void);	

典型用法:  

	CDebugTrace::SetTraceLevel(6);	//设置可打印的日志级别
    //设置日志选项
	CDebugTrace::SetTraceOptions(CDebugTrace::GetTraceOptions() \
		| CDebugTrace::Timestamp | CDebugTrace::LogLevel\
		& ~CDebugTrace::FileAndLine | CDebugTrace::AppendToFile\
		| CDebugTrace::PrintToConsole);

	//设置日志保存文件名
	CDebugTrace::SetLogFileName("d:\\test.log");

    TRACE0("姓名:%s,年龄:%d,性别:%d",lszName,26,true);
	RecordLog(1,"姓名:" << lszName<<"年龄:"<< 26 << "性别" << true);	

	ASSERT(apStrVal != NULL);	
*/
// $_FILEHEADER_END ******************************

#ifndef _DEBUGTRACE_HEAD_
#define _DEBUGTRACE_HEAD_

#ifdef WIN32
#include <windows.h>
#endif
#include "CriticalSection.h"
//#include "TypeDeff.h"
//////////////////////////////////////////////////////////////////////
//有关ASSERT的定义

#undef ASSERT		//取消ASSERT宏

//  重新定义ASSERT宏  
#ifdef _DEBUG		//测试版

	#define ASSERT(f)               \
	if(f)							\
		;							\
	else                            \
		CDebugTrace::AssertFail(#f,__FILE__, __LINE__)

#else			//发行版

    #define ASSERT(f)

#endif

//////////////////////////////////////////////////////////////////////
//有关TRACE的定义

//RecordLog是流方式的日志输出
//eg: RecordLog(1,"姓名:" << lszName<<"年龄:"<< 26 << "性别" << true);	
#define RecordLog(level, args) \
if (!CDebugTrace::CanTrace(level)) 	;  else\
	CDebugTrace::EndTrace(CDebugTrace::BeginTrace(level,__FILE__,__LINE__) << args << '\n')

//TraceLogX系列是类似printf方式输出,X表示日志级别
//eg:TRACE0("姓名:%s,年龄:%d,性别:%d",lszName,26,true);
#define TraceLog0 \
	if (!CDebugTrace::CanTrace(0)) 	;  else\
		CDebugTrace::BeginTrace(0,__FILE__,__LINE__).TraceFormat

#define TraceLog1 \
    if (!CDebugTrace::CanTrace(1)) 	;  else\
        CDebugTrace::BeginTrace(1,__FILE__,__LINE__).TraceFormat

#define TraceLog2 \
    if (!CDebugTrace::CanTrace(2)) 	;  else\
        CDebugTrace::BeginTrace(2,__FILE__,__LINE__).TraceFormat

#define TraceLog3 \
    if (!CDebugTrace::CanTrace(3)) 	;  else\
        CDebugTrace::BeginTrace(3,__FILE__,__LINE__).TraceFormat

#define TraceLog4 \
    if (!CDebugTrace::CanTrace(4)) 	;  else\
        CDebugTrace::BeginTrace(4,__FILE__,__LINE__).TraceFormat

#define TraceLog5 \
    if (!CDebugTrace::CanTrace(5)) 	;  else\
        CDebugTrace::BeginTrace(5,__FILE__,__LINE__).TraceFormat

#define TraceLog6 \
    if (!CDebugTrace::CanTrace(6)) 	;  else\
        CDebugTrace::BeginTrace(6,__FILE__,__LINE__).TraceFormat

//取消TRACE定义
#undef TRACE
#undef TRACE0
#undef TRACE1
#undef TRACE2
#undef TRACE3
#undef TRACE4
#undef TRACE5
#undef TRACE6

//重新定义TRACE语句
#ifdef _DEBUG			//调试版

	#define TRACE RecordLog	//打印日志

	#define TRACE0 TraceLog0	

	#define TRACE1 TraceLog1
	
	#define TRACE2 TraceLog2
	
	#define TRACE3 TraceLog3
	
	#define TRACE4 TraceLog4
	
	#define TRACE5 TraceLog5
	
	#define TRACE6 TraceLog6
	
#else					//发行版

	#define TRACE(level, args) //TRACE函数为空

	#define TRACE0 ;
	#define TRACE1 ;
	#define TRACE2 ;
	#define TRACE3 ;
	#define TRACE4 ;
	#define TRACE5 ;
	#define TRACE6 ;

#endif //_DEBUG

//////////////////////////////////////////////////////////////////
//下面是CDebugTrace类的定义
#define DEF_TRACE_BUFF_LEN 2048
class CDebugTrace
{
private:
	long		mlDataLen;			 //数据长度
    char		mszPrintBuff[DEF_TRACE_BUFF_LEN];	 //打印数据缓存
	
    UC::CCriticalSection moCriticalSection;     //临界区
private:
    static int		   mnLogLevel;			 //日志等级
	static char		   mszLogFileName[512]; //日志文件名称
	static unsigned    muTraceOptions;		 //打印日志选项	

public:
	//打印选项
	enum Options 
	{
		/// 打印时间
		Timestamp = 1,
		/// 打印日志级别
		LogLevel = 2,
		/// 打印源文件名和行号
		FileAndLine = 4,
		/// 把日志追加到文件中
		AppendToFile = 8,
		///输出日志到控制台
		PrintToConsole = 16
	};    

	//构造函数	
	CDebugTrace();
	//析够函数
	~CDebugTrace();
public:
	//设置日志级别(0级最高,1其次,依次类推,小于该等级的日志不打印)
	static void SetTraceLevel(int aiTraceLevel);
	
	//设置日志文件名
	static void SetLogFileName(char *aszLogFile);

	// 设置TRACE选项 .注意函数可以 OR 各选项
	static void SetTraceOptions(unsigned options /** New level for trace */ );

	//取得TRACE选项
	static unsigned GetTraceOptions(void);

	//判断给定级别是否可以打印
	static bool CanTrace(int aiLogLevel);					

	//开始打印
	static CDebugTrace& BeginTrace(int aiLogLevel,char *apSrcFile,int aiSrcLine);	
		
	//结束打印
	static void EndTrace(CDebugTrace &aoDebugTrace);

	//断言失败处理函数
	static void AssertFail(char * strCond,char *strFile, unsigned uLine);

public:
    //按照函数printf的类似格式打印日志
	void TraceFormat(const char * pFmt,...);	

	//以下分别输出各种数据类型
	CDebugTrace& operator << (char acCharVal);	
	CDebugTrace& operator << (bool abBoolVal);
	CDebugTrace& operator << (short asShortVal);
	CDebugTrace& operator << (unsigned short asShortVal);
	CDebugTrace& operator << (int aiIntVal);
	CDebugTrace& operator << (unsigned int aiIntVal);
	CDebugTrace& operator << (long alLongVal);
	CDebugTrace& operator << (unsigned long alLongVal);
	CDebugTrace& operator << (float afFloatVal);
	CDebugTrace& operator << (double afdoubleVal);
	CDebugTrace& operator << (__int64 aiInt64Val);
	CDebugTrace& operator << (const char *apStrVal);	
};

#endif//_DEBUGTRACE_HEAD_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -