DebugTrace.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:15k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2. *  Openmysee
  3. *
  4. *  This program is free software; you can redistribute it and/or modify
  5. *  it under the terms of the GNU General Public License as published by
  6. *  the Free Software Foundation; either version 2 of the License, or
  7. *  (at your option) any later version.
  8. *
  9. *  This program is distributed in the hope that it will be useful,
  10. *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. *  GNU General Public License for more details.
  13. *
  14. *  You should have received a copy of the GNU General Public License
  15. *  along with this program; if not, write to the Free Software
  16. *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17. *
  18. */
  19. #include "stdafx.h"
  20. #include "DebugTrace.h"
  21. #ifdef WIN32
  22. #include <windows.h>
  23. #endif
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <time.h>
  27. #include <sys/types.h>
  28. #include <sys/timeb.h>
  29. #include <stdarg.h>
  30. #include <string.h>
  31. int CDebugTrace::mnLogLevel = 3;
  32. char CDebugTrace::mszLogFileName[512] = {0};
  33. unsigned CDebugTrace::muTraceOptions = Timestamp;
  34. static CDebugTrace goDebugTrace;
  35. // $_FUNCTION_BEGIN ******************************
  36. // 函数名称: CDebugTrace( )
  37. // 函数参数: 
  38. // 返 回 值: 
  39. // 函数说明: 构造函数
  40. // $_FUNCTION_END ********************************
  41. CDebugTrace::CDebugTrace( )
  42. {
  43.     mlDataLen = 0;
  44. }
  45. // $_FUNCTION_BEGIN ******************************
  46. // 函数名称: ~CDebugTrace( )
  47. // 函数参数: 
  48. // 返 回 值: 
  49. // 函数说明: 析构函数
  50. // $_FUNCTION_END ********************************
  51. CDebugTrace::~CDebugTrace( )
  52. {
  53.     
  54. }
  55. // $_FUNCTION_BEGIN ******************************
  56. // 函数名称: CDebugTrace& operator << ( char acCharVal )
  57. // 函数参数: char acCharVal:要打印的字符
  58. // 返 回 值: 
  59. // 函数说明: 打印单个字符
  60. // $_FUNCTION_END ********************************
  61. CDebugTrace& CDebugTrace::operator << ( char acCharVal )
  62. {
  63.     char * lpWritePtr = mszPrintBuff + mlDataLen;
  64.     
  65.     mlDataLen += sprintf( lpWritePtr,"%c",acCharVal );
  66.     
  67.     ASSERT( mlDataLen <= DEF_TRACE_BUFF_LEN );
  68.     return *this;
  69. }
  70. // $_FUNCTION_BEGIN ******************************
  71. // 函数名称: CDebugTrace& operator << ( bool abBoolVal )
  72. // 函数参数: bool abBoolVal:要打印的BOOL型数据
  73. // 返 回 值: 
  74. // 函数说明: 打印bool值
  75. // $_FUNCTION_END ********************************
  76. CDebugTrace& CDebugTrace::operator << ( bool abBoolVal )
  77. {
  78.     char * lpWritePtr = mszPrintBuff + mlDataLen;
  79.     if ( abBoolVal )
  80.     {
  81.         mlDataLen += sprintf( lpWritePtr,"%s","true" );
  82.     }
  83.     else
  84.     {
  85.         mlDataLen += sprintf( lpWritePtr,"%s","false" );
  86.     }
  87.     ASSERT( mlDataLen <= DEF_TRACE_BUFF_LEN );
  88.     return *this;
  89. }
  90. // $_FUNCTION_BEGIN ******************************
  91. // 函数名称: CDebugTrace& operator << ( short asShortVal )
  92. // 函数参数: short asShortVal:要打印的short型数据
  93. // 返 回 值: 
  94. // 函数说明: 打印short值
  95. // $_FUNCTION_END ********************************
  96. CDebugTrace& CDebugTrace::operator << ( short asShortVal )
  97. {
  98.     char * lpWritePtr = mszPrintBuff + mlDataLen;
  99.     
  100.     mlDataLen += sprintf( lpWritePtr,"%d",asShortVal );
  101.     
  102.     ASSERT( mlDataLen <= DEF_TRACE_BUFF_LEN );
  103.     return *this;
  104. }
  105. // $_FUNCTION_BEGIN ******************************
  106. // 函数名称: CDebugTrace& operator << ( unsigned short asShortVal )
  107. // 函数参数: unsigned short asShortVal:要打印的 unsigned short型数据
  108. // 返 回 值: 
  109. // 函数说明: 打印unsigned short值
  110. // $_FUNCTION_END ********************************
  111. CDebugTrace& CDebugTrace::operator << ( unsigned short asShortVal )
  112. {
  113.     char * lpWritePtr = mszPrintBuff + mlDataLen;
  114.     
  115.     mlDataLen += sprintf( lpWritePtr,"%u",asShortVal );
  116.     
  117.     ASSERT( mlDataLen <= DEF_TRACE_BUFF_LEN );
  118.     return *this;
  119. }
  120. // $_FUNCTION_BEGIN ******************************
  121. // 函数名称: CDebugTrace& operator << ( int aiIntVal )
  122. // 函数参数: int aiIntVal:要打印的 int 型数据
  123. // 返 回 值: 
  124. // 函数说明: 打印int值
  125. // $_FUNCTION_END ********************************
  126. CDebugTrace& CDebugTrace::operator << ( int aiIntVal )
  127. {
  128.     char * lpWritePtr = mszPrintBuff + mlDataLen;
  129.     
  130.     mlDataLen += sprintf( lpWritePtr,"%d",aiIntVal );
  131.     
  132.     ASSERT( mlDataLen <= DEF_TRACE_BUFF_LEN );
  133.     return *this;
  134. }
  135. // $_FUNCTION_BEGIN ******************************
  136. // 函数名称: CDebugTrace& operator << ( unsigned int aiIntVal )
  137. // 函数参数: unsigned int aiIntVal:要打印的 unsigned int 型数据
  138. // 返 回 值: 
  139. // 函数说明: 打印 unsigned int值
  140. // $_FUNCTION_END ********************************
  141. CDebugTrace& CDebugTrace::operator << ( unsigned int aiIntVal )
  142. {
  143.     char * lpWritePtr = mszPrintBuff + mlDataLen;
  144.     
  145.     mlDataLen += sprintf( lpWritePtr,"%u",aiIntVal );
  146.     
  147.     ASSERT( mlDataLen <= DEF_TRACE_BUFF_LEN );
  148.     return *this;
  149. }
  150. // $_FUNCTION_BEGIN ******************************
  151. // 函数名称: CDebugTrace& operator << ( long aiIntVal )
  152. // 函数参数: long aiIntVal:要打印的 long 型数据
  153. // 返 回 值: 
  154. // 函数说明: 打印 long值
  155. // $_FUNCTION_END ********************************
  156. CDebugTrace& CDebugTrace::operator << ( long alLongVal )
  157. {
  158.     char * lpWritePtr = mszPrintBuff + mlDataLen;
  159.     
  160.     mlDataLen += sprintf( lpWritePtr,"%ld",alLongVal );
  161.     
  162.     ASSERT( mlDataLen <= DEF_TRACE_BUFF_LEN );
  163.     return *this;
  164. }
  165. // $_FUNCTION_BEGIN ******************************
  166. // 函数名称: CDebugTrace& operator << ( unsigned long aiIntVal )
  167. // 函数参数: unsigned long aiIntVal:要打印的 unsigned long 型数据
  168. // 返 回 值: 
  169. // 函数说明: 打印 unsigned long
  170. // $_FUNCTION_END ********************************
  171. CDebugTrace& CDebugTrace::operator << ( unsigned long alLongVal )
  172. {
  173.     char * lpWritePtr = mszPrintBuff + mlDataLen;
  174.     
  175.     mlDataLen += sprintf( lpWritePtr,"%lu",alLongVal );
  176.     
  177.     ASSERT( mlDataLen <= DEF_TRACE_BUFF_LEN );
  178.     return *this;
  179. }
  180. // $_FUNCTION_BEGIN ******************************
  181. // 函数名称: CDebugTrace& operator << ( float afFloatVal )
  182. // 函数参数: float afFloatVal:要打印的 float 型数据
  183. // 返 回 值: 
  184. // 函数说明: 打印float值
  185. // $_FUNCTION_END ********************************
  186. CDebugTrace& CDebugTrace::operator << ( float afFloatVal )
  187. {
  188.     char * lpWritePtr = mszPrintBuff + mlDataLen;
  189.     
  190.     mlDataLen += sprintf( lpWritePtr,"%f",afFloatVal );
  191.     
  192.     ASSERT( mlDataLen <= DEF_TRACE_BUFF_LEN );
  193.     return *this;
  194. }
  195. // $_FUNCTION_BEGIN ******************************
  196. // 函数名称: CDebugTrace& operator << ( double afdoubleVal )
  197. // 函数参数: double afdoubleVal:要打印的 double 型数据
  198. // 返 回 值: 
  199. // 函数说明: 打印double值
  200. // $_FUNCTION_END ********************************
  201. CDebugTrace& CDebugTrace::operator << ( double afdoubleVal )
  202. {
  203.     char * lpWritePtr = mszPrintBuff + mlDataLen;
  204.     
  205.     mlDataLen += sprintf( lpWritePtr,"%f",afdoubleVal );
  206.     
  207.     ASSERT( mlDataLen <= DEF_TRACE_BUFF_LEN );
  208.     return *this;
  209. }
  210. // $_FUNCTION_BEGIN ******************************
  211. // 函数名称: CDebugTrace& operator << ( __int64 aiInt64Val )
  212. // 函数参数: __int64 aiInt64Val:要打印的 __int64  型数据
  213. // 返 回 值: 
  214. // 函数说明: 打印64位整数
  215. // $_FUNCTION_END ********************************
  216. CDebugTrace& CDebugTrace::operator << ( __int64 aiInt64Val )
  217. {
  218.     char *lpWritePtr = mszPrintBuff + mlDataLen;
  219.     
  220.     mlDataLen += sprintf( lpWritePtr,"%I64d",aiInt64Val );
  221.     
  222.     ASSERT( mlDataLen <= DEF_TRACE_BUFF_LEN );
  223.     return *this;
  224. }
  225. // $_FUNCTION_BEGIN ******************************
  226. // 函数名称: CDebugTrace& operator << ( const char *apStrVal )
  227. // 函数参数: const char *apStrVal:要打印的结尾的字符串
  228. // 返 回 值: 
  229. // 函数说明: 打印以结尾的字符串值
  230. // $_FUNCTION_END ********************************
  231. CDebugTrace& CDebugTrace::operator << ( const char *apStrVal )
  232. {
  233.     char * lpWritePtr = mszPrintBuff + mlDataLen;
  234.     if ( apStrVal == 0 )
  235.     {
  236.         mlDataLen += sprintf( lpWritePtr,"%s","NULL" );
  237.     }
  238.     else
  239.     {
  240.         mlDataLen += sprintf( lpWritePtr,"%s",apStrVal );
  241.     }
  242.     
  243.     ASSERT( mlDataLen <= DEF_TRACE_BUFF_LEN );
  244.     return *this;
  245. }
  246. // $_FUNCTION_BEGIN ******************************
  247. // 函数名称: void TraceFormat( const char * pFmt,... )
  248. // 函数参数: const char * pFmt,...( 可变长度参数,如:"姓名:%s,年龄:%d","zht",26 )
  249. // 返 回 值: void
  250. // 函数说明: 类似printf函数的格式打印一串日志
  251. // $_FUNCTION_END ********************************
  252. void CDebugTrace::TraceFormat( const char * pFmt,... )
  253. {
  254.     va_list argptr;
  255.     char strPrintBuff[512];
  256.     
  257.     //把可变参数序列化到strPrintBuff中
  258.     va_start( argptr,pFmt );
  259.     vsprintf( strPrintBuff, pFmt, argptr );
  260.     va_end( argptr );
  261.     
  262.     //把strPrintBuff追加到mszPrintBuff中
  263.     char * lpWritePtr = mszPrintBuff + mlDataLen;
  264.     mlDataLen += sprintf( lpWritePtr,"%s",strPrintBuff );
  265.     
  266.     //调用EndTrace结束打印
  267.     EndTrace( *this );
  268. }
  269. ////////////////////////////////////////////////
  270. //以下是静态函数
  271. // $_FUNCTION_BEGIN ******************************
  272. // 函数名称: void CDebugTrace::SetTraceLevel( int aiTraceLevel )
  273. // 函数参数: int aiTraceLevel:日志级别
  274. // 返 回 值: void
  275. // 函数说明: 设置TRACE等级( 0级最高,1其次,依次类推,小于该等级的日志不打印 )
  276. // $_FUNCTION_END ********************************
  277. void CDebugTrace::SetTraceLevel( int aiTraceLevel )
  278. {
  279.     CDebugTrace::mnLogLevel = aiTraceLevel;
  280. }
  281. // $_FUNCTION_BEGIN ******************************
  282. // 函数名称: void CDebugTrace::SetLogFileName( char *aszLogFile )
  283. // 函数参数: char *aszLogFile:日志文件名
  284. // 返 回 值: void
  285. // 函数说明: 设置输出日志文件名
  286. // $_FUNCTION_END ********************************
  287. void CDebugTrace::SetLogFileName( char *aszLogFile )
  288. {
  289.     if ( aszLogFile != NULL )
  290.     {
  291.         strcpy( CDebugTrace::mszLogFileName,aszLogFile );
  292.     }
  293. }
  294. // $_FUNCTION_BEGIN ******************************
  295. // 函数名称: void CDebugTrace::SetTraceOptions( unsigned options /** New level for trace */ )
  296. // 函数参数: unsigned options:打印选项 各选项可以相加
  297. // 返 回 值: void
  298. // 函数说明: 设置TRACE选项
  299. // $_FUNCTION_END ********************************
  300. void CDebugTrace::SetTraceOptions( unsigned options /** New level for trace */ )
  301. {
  302.     CDebugTrace::muTraceOptions = options;
  303. }
  304. //
  305. // $_FUNCTION_BEGIN ******************************
  306. // 函数名称: unsigned CDebugTrace::GetTraceOptions( void )
  307. // 函数参数: 
  308. // 返 回 值: unsigned 打印选项
  309. // 函数说明: 取得TRACE选项
  310. // $_FUNCTION_END ********************************
  311. unsigned CDebugTrace::GetTraceOptions( void )
  312. {
  313.     return CDebugTrace::muTraceOptions;
  314. }
  315. // $_FUNCTION_BEGIN ******************************
  316. // 函数名称: bool CDebugTrace::CanTrace( int aiLogLevel )
  317. // 函数参数: int aiLogLevel:日志级别
  318. // 返 回 值: bool
  319. // 函数说明: 判断给定级别是否可以打印
  320. // $_FUNCTION_END ********************************
  321. bool CDebugTrace::CanTrace( int aiLogLevel )
  322. {
  323.     return ( aiLogLevel <= CDebugTrace::mnLogLevel );
  324. }
  325. //*****************************************************************************
  326. // 函数原型: BeginTrace( int aiLogLevel,char *apSrcFile,int aiSrcLine )
  327. //  函数说明:   开始打印一个日志
  328. //  参数:      int aiLogLevel( 日志的级别 ),char *apSrcFile( 源文件名 ),
  329. // int aiSrcLine( 源行数 )
  330. //  返回值:    返回类对象自身
  331. //  用法: BeginTrace( 3,__FILE__,__LINE__ )
  332. //*****************************************************************************
  333. CDebugTrace& CDebugTrace::BeginTrace( int aiLogLevel,char *apSrcFile,int aiSrcLine )
  334. {
  335.     CDebugTrace *lpDebugTrace = NULL;
  336.     //lpDebugTrace = new CDebugTrace( );
  337.     lpDebugTrace = &goDebugTrace;
  338.     lpDebugTrace->moCriticalSection.Enter();
  339.     ASSERT( lpDebugTrace != NULL );
  340.     lpDebugTrace->mlDataLen = 0;  //已打印的数据长度清0
  341.     
  342.     //如果要求输出时间,则在日志中输出日志产生的时间( 分:秒:毫秒 )
  343.     if ( CDebugTrace::muTraceOptions & Timestamp ) 
  344.     {
  345.         time_t ltmNow;
  346.         struct timeb loTimeb;
  347.         
  348.         time( &ltmNow );
  349.         ftime( &loTimeb ); 
  350.         struct tm * lstrutime = localtime( &ltmNow );
  351.         
  352.         char lszTraceBuff[20];
  353.         sprintf( lszTraceBuff,"%02d:%02d:%02d:%03d ",
  354.             lstrutime->tm_hour,lstrutime->tm_min,lstrutime->tm_sec,loTimeb.millitm );
  355.         
  356.         *lpDebugTrace << lszTraceBuff;
  357.     }
  358.     //如果要求输出日志级别,则在日志中输出日志级别
  359.     if ( CDebugTrace::muTraceOptions & LogLevel )
  360.     {
  361.         *lpDebugTrace << aiLogLevel << ' ';
  362.     }
  363.     
  364.     //如果要求输出源文件名和行号,则在日志中输出源文件名和行号
  365.     if ( CDebugTrace::muTraceOptions & FileAndLine ) 
  366.     {
  367.         *lpDebugTrace << apSrcFile << "( " << aiSrcLine << " ) ";
  368.     }
  369.     
  370.     //返回对象引用
  371.     return *lpDebugTrace;
  372. }
  373. //*****************************************************************************
  374. // 函数原型: EndTrace( CDebugTrace &aoDebugTrace )
  375. //  函数说明:   结束打印一个日志
  376. //  参数:      CDebugTrace &aoDebugTrace( CDebugTrace 对象引用 )
  377. //  返回值:    
  378. //  用法:
  379. //*****************************************************************************
  380. void CDebugTrace::EndTrace( CDebugTrace &aoDebugTrace ) //结束打印
  381. {
  382. #ifdef WIN32
  383.     //输出到调试窗口中
  384.     OutputDebugString( aoDebugTrace.mszPrintBuff ); 
  385. #endif
  386.     //若要求输出到控制台,则把日志信息在控制台也打印一下
  387.     if ( CDebugTrace::muTraceOptions & PrintToConsole ) 
  388.         printf( "%s",aoDebugTrace.mszPrintBuff );
  389.     
  390.     //若要求写文件且设置了日志文件名,则把日志信息写入文件中
  391.     if ( ( CDebugTrace::muTraceOptions & AppendToFile ) 
  392.         && ( strlen( CDebugTrace::mszLogFileName ) > 1 ) )
  393.     {
  394.         FILE * lfpTraceFile = NULL;
  395.         lfpTraceFile = fopen( CDebugTrace::mszLogFileName,"a" ); 
  396.         if ( lfpTraceFile != NULL )
  397.         {
  398.             fprintf( lfpTraceFile,"%s",aoDebugTrace.mszPrintBuff );
  399.             fclose( lfpTraceFile );
  400.         }
  401.     }
  402.     aoDebugTrace.moCriticalSection.Leave();
  403.     //delete &aoDebugTrace;
  404. }
  405. // $_FUNCTION_BEGIN ******************************
  406. // 函数名称: void CDebugTrace::AssertFail( char * strCond,char *strFile, unsigned uLine )
  407. // 函数参数: char * strCond: 函数表达式
  408. //           char *strFile:源文件名
  409. //           unsigned uLine:行号
  410. // 返 回 值: void
  411. // 函数说明: 弹出ASSERT出错信息
  412. // $_FUNCTION_END ********************************
  413. void CDebugTrace::AssertFail( char * strCond,char *strFile, unsigned uLine )
  414. {
  415. #ifdef WIN32    
  416.     char szMessage[512]; 
  417.     char strExePath[512];
  418.     GetModuleFileName( 0, strExePath, 200 );
  419.       
  420.     sprintf( szMessage, "nDebug Assertion Failed!nFile: %s nLine:%d nCond: ASSERT( %s ); n",strFile,uLine,strCond );    
  421.     OutputDebugString( szMessage );
  422.     sprintf( szMessage, " Debug Assertion Failed!nn Program:    %s     n Condition:  ASSERT( %s );       n SourceFile: %s       n LineNum:    %d nn Continue?",
  423.         strExePath,strCond,strFile,uLine );
  424.     int nResult = MessageBox( NULL,szMessage,"Assert failure",MB_OKCANCEL+MB_ICONERROR );    
  425.     if ( nResult == IDCANCEL )
  426.     {
  427.         FatalExit( -1 );
  428.     }
  429.     else
  430.     {
  431.         DebugBreak();
  432.     }
  433. #else    
  434.     printf( "Debug Assertion Failed!nnCondition:  ASSERT( %s );       nSourceFile: %s       nLineNum:    %d nnContinue?",
  435.         strCond,strFile,uLine );
  436.     
  437.     char lcUserInput =  getchar( );
  438.     if ( lcUserInput != 'y' && lcUserInput != 'Y' )
  439.     {
  440.         exit( -1 );
  441.     }
  442. #endif 
  443. }