#ifndef _DEBUG_H_ #define _DEBUG_H_ // Debug - used to track specific problems during debugging. Debug's are temporary, // and should be removed (or promoted to Info/Warning's) before check-in. // Info - general information during normal operation // Warning - warnings, recoverable errors // Error - things that shouldn't happen // Param - incorect params passed in, etc. // Interop - unexpected return codes/behavior from other (external) components // Assert - Assert-level really-shouldn't-happen errors. #define _TRACE_DEBUG 0 #define _TRACE_INFO 1 #define _TRACE_WARNING 2 #define _TRACE_ERROR 3 #define _TRACE_PARAM 4 #define _TRACE_PARAWARN 5 #define _TRACE_INTEROP 6 #define _TRACE_ASSERT_D 7 // Debug-build assert - really does assert #define _TRACE_ASSERT_R 8 // Release-build assert - only logs error, doesn't halt program #define _TRACE_CALL 9 #define _TRACE_RET 10 void _Trace ( LPCTSTR pFile, ULONG uLineNo, DWORD dwLevel, const void * pThis, LPCTSTR pStr ); // Also adds message corresponding to HRESULT... void _TraceHR ( LPCTSTR pFile, ULONG uLineNo, DWORD dwLevel, const void * pThis, HRESULT hr, LPCTSTR pStr ); // Also adds message corresponding to GetLastError()... void _TraceW32 ( LPCTSTR pFile, ULONG uLineNo, DWORD dwLevel, const void * pThis, LPCTSTR pStr ); // // _DTrace* is debug-only, while _Trace is debug and release... // #ifdef _DEBUG #define _DTrace( pFile, uLineNo, dwLevel, pThis, pStr ) _Trace( pFile, uLineNo, dwLevel, pThis, pStr ) #define _DTraceHR( pFile, uLineNo, dwLevel, pThis, hr, pStr ) _TraceHR( pFile, uLineNo, dwLevel, pThis, hr, pStr ) #define _DTraceW32( pFile, uLineNo, dwLevel, pThis, pStr ) _TraceW32( pFile, uLineNo, dwLevel, pThis, pStr ) #define _TRACE_ASSERT _TRACE_ASSERT_D class DebugCallRetTracker { const void * m_pThis; LPCTSTR m_pMethodName; LPCTSTR m_pFile; ULONG m_Line; public: DebugCallRetTracker( const void * pThis, LPCTSTR pMethodName, LPCTSTR pFile, ULONG Line ) : m_pThis( pThis ), m_pMethodName( pMethodName ), m_pFile( pFile ), m_Line( Line ) { _Trace( m_pFile, m_Line, _TRACE_CALL, m_pThis, m_pMethodName ); } ~DebugCallRetTracker( ) { _Trace( m_pFile, m_Line, _TRACE_RET, m_pThis, m_pMethodName ); } }; #define IMETHOD( name ) DebugCallRetTracker IMETHOD_temp_var( this, TEXT( # name ), TEXT( __FILE__ ), __LINE__ ) #else // _DEBUG #define _DTrace( pFile, uLineNo, dwLevel, pThis, pStr ) #define _DTraceHR( pFile, uLineNo, dwLevel, hr, pThis, pStr ) #define _DTraceW32( pFile, uLineNo, dwLevel, pThis, pStr ) #define IMETHOD( name ) #define _TRACE_ASSERT _TRACE_ASSERT_R #endif // _DEBUG #define Assert( cond ) if( cond ) { } else _Trace( TEXT( __FILE__ ), __LINE__, _TRACE_ASSERT, NULL, TEXT( # cond ) ) #define AssertMsg( cond, str ) if( cond ) { } else _Trace( TEXT( __FILE__ ), __LINE__, _TRACE_ASSERT, NULL, str ) #define TraceDebug( str ) _DTrace( TEXT( __FILE__ ), __LINE__, _TRACE_DEBUG, NULL, str ) #define TraceInfo( str ) _DTrace( TEXT( __FILE__ ), __LINE__, _TRACE_INFO, NULL, str ) #define TraceWarning( str ) _DTrace( TEXT( __FILE__ ), __LINE__, _TRACE_WARNING, NULL, str ) #define TraceError( str ) _Trace( TEXT( __FILE__ ), __LINE__, _TRACE_ERROR, NULL, str ) #define TraceParam( str ) _Trace( TEXT( __FILE__ ), __LINE__, _TRACE_PARAM, NULL, str ) #define TraceParamWarn( str ) _Trace( TEXT( __FILE__ ), __LINE__, _TRACE_PARAMWARN, NULL, str ) #define TraceInterop( str ) _Trace( TEXT( __FILE__ ), __LINE__, _TRACE_INTEROP, NULL, str ) #define TraceDebugHR( hr, str ) _DTraceHR( TEXT( __FILE__ ), __LINE__, _TRACE_DEBUG, NULL, hr, str ) #define TraceInfoHR( hr, str ) _DTraceHR( TEXT( __FILE__ ), __LINE__, _TRACE_INFO, NULL, hr, str ) #define TraceWarningHR( hr, str ) _DTraceHR( TEXT( __FILE__ ), __LINE__, _TRACE_WARNING, NULL, hr, str ) #define TraceErrorHR( hr, str ) _TraceHR( TEXT( __FILE__ ), __LINE__, _TRACE_ERROR, NULL, hr, str ) #define TraceParamHR( hr, str ) _TraceHR( TEXT( __FILE__ ), __LINE__, _TRACE_PARAM, NULL, hr, str ) #define TraceParamWarnHR( hr, str ) _TraceHR( TEXT( __FILE__ ), __LINE__, _TRACE_PARAMWARN, NULL, hr, str ) #define TraceInteropHR( hr, str ) _TraceHR( TEXT( __FILE__ ), __LINE__, _TRACE_INTEROP, NULL, hr, str ) #define TraceDebugW32( str ) _DTraceW32( TEXT( __FILE__ ), __LINE__, _TRACE_DEBUG, NULL, str ) #define TraceInfoW32( str ) _DTraceW32( TEXT( __FILE__ ), __LINE__, _TRACE_INFO, NULL, str ) #define TraceWarningW32( str ) _DTraceW32( TEXT( __FILE__ ), __LINE__, _TRACE_WARNING, NULL, str ) #define TraceErrorW32( str ) _TraceW32( TEXT( __FILE__ ), __LINE__, _TRACE_ERROR, NULL, str ) #define TraceParamW32( str ) _TraceW32( TEXT( __FILE__ ), __LINE__, _TRACE_PARAM, NULL, str ) #define TraceParamWarnW32( str ) _TraceW32( TEXT( __FILE__ ), __LINE__, _TRACE_PARAMWARN, NULL, str ) #define TraceInteropW32( str ) _TraceW32( TEXT( __FILE__ ), __LINE__, _TRACE_INTEROP, NULL, str ) #endif // _DEBUG_H_