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