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