|
|
/*----------------------------------------------------------------------
dbgtrace.h Definitions for async tracing routines
Copyright (C) 1994 Microsoft Corporation All rights reserved.
Authors: gordm Gord Mangione
History: 01/30/95 gordm Created. ----------------------------------------------------------------------*/
#if !defined(_DBGTRACE_H_)
#define _DBGTRACE_H_
#ifdef __cplusplus
extern "C" { #endif
#ifndef THIS_FILE
#define THIS_FILE __FILE__
#endif
#if defined( NOTRACE )
#define FLUSHASYNCTRACE // for _ASSERT below
#define FatalTrace 1 ? (void)0 : PreAsyncTrace
#define ErrorTrace 1 ? (void)0 : PreAsyncTrace
#define DebugTrace 1 ? (void)0 : PreAsyncTrace
#define StateTrace 1 ? (void)0 : PreAsyncTrace
#define FunctTrace 1 ? (void)0 : PreAsyncTrace
#define ErrorTraceX 1 ? (void)0 : PreAsyncTrace
#define DebugTraceX 1 ? (void)0 : PreAsyncTrace
#define MessageTrace( lParam, pbData, cbData )
#define BinaryTrace( lParam, pbData, cbData )
#define UserTrace( lParam, dwUserType, pbData, cbData )
#define TraceFunctEnter( sz )
#define TraceFunctEnterEx( lparam, sz )
#define TraceFunctLeave()
//
// import functions from DBGTRACE.DLL
//
#define InitAsyncTrace()
#define TermAsyncTrace()
#define FlushAsyncTrace()
__inline int PreAsyncTrace( LPARAM lParam, LPCSTR szFormat, ... ) { return( 1); }
#define MessageTrace( lParam, pbData, cbData )
#define BinaryTrace( lParam, pbData, cbData )
#define UserTrace( lParam, dwUserType, pbData, cbData )
#else // NOTRACE
#define FLUSHASYNCTRACE FlushAsyncTrace(), // for _ASSERT below
#define FatalTrace !(__dwEnabledTraces & FATAL_TRACE_MASK) ? \
(void)0 : \ SetAsyncTraceParams( THIS_FILE, __LINE__, ___pszFunctionName, FATAL_TRACE_MASK ) && \ PreAsyncTrace
#define ErrorTrace !(__dwEnabledTraces & ERROR_TRACE_MASK) ? \
(void)0 : \ SetAsyncTraceParams( THIS_FILE, __LINE__, ___pszFunctionName, ERROR_TRACE_MASK ) && \ PreAsyncTrace
#define DebugTrace !(__dwEnabledTraces & DEBUG_TRACE_MASK) ? \
(void)0 : \ SetAsyncTraceParams( THIS_FILE, __LINE__, ___pszFunctionName, DEBUG_TRACE_MASK ) && \ PreAsyncTrace
#define StateTrace !(__dwEnabledTraces & STATE_TRACE_MASK) ? \
(void)0 : \ SetAsyncTraceParams( THIS_FILE, __LINE__, ___pszFunctionName, STATE_TRACE_MASK ) && \ PreAsyncTrace
#define FunctTrace !(__dwEnabledTraces & FUNCT_TRACE_MASK) ? \
(void)0 : \ SetAsyncTraceParams( THIS_FILE, __LINE__, ___pszFunctionName, FUNCT_TRACE_MASK ) && \ PreAsyncTrace
//
// Support for unspecified function names
//
#define ErrorTraceX !(__dwEnabledTraces & ERROR_TRACE_MASK) ? \
(void)0 : \ SetAsyncTraceParams( THIS_FILE, __LINE__, "Fn", ERROR_TRACE_MASK ) && \ PreAsyncTrace
#define DebugTraceX !(__dwEnabledTraces & DEBUG_TRACE_MASK) ? \
(void)0 : \ SetAsyncTraceParams( THIS_FILE, __LINE__, "Fn", DEBUG_TRACE_MASK ) && \ PreAsyncTrace
//
// use to explicitly remove function tracing even for debug builds
//
#define TraceQuietEnter( sz ) \
char *___pszFunctionName = sz
//
// disable function tracing for retail builds
// reduces code size increase and only should
// only be used sparingly
//
#ifdef DEBUG
#define TraceFunctEnter( sz ) \
TraceQuietEnter( sz ); \ FunctTrace( 0, "Entering %s", sz )
#define TraceFunctLeave() \
FunctTrace( 0, "Leaving %s", ___pszFunctionName )
#define TraceFunctEnterEx( lParam, sz ) \
TraceQuietEnter( sz ); \ FunctTrace( lParam, "Entering %s", sz )
#define TraceFunctLeaveEx( lParam ) \
FunctTrace( lParam, "Leaving %s", ___pszFunctionName )
#else
#define TraceFunctEnter( sz ) TraceQuietEnter( sz )
#define TraceFunctEnterEx( lParam, sz ) TraceQuietEnter( sz )
#define TraceFunctLeave()
#define TraceFunctLeaveEx( lParam )
#endif
//
// fixed number of parameters for Binary trace macros
//
#define MessageTrace( lParam, pbData, cbData ) \
!(__dwEnabledTraces & MESSAGE_TRACE_MASK) ? \ (void)0 : \ SetAsyncTraceParams( THIS_FILE, __LINE__, ___pszFunctionName, MESSAGE_TRACE_MASK ) && \ AsyncBinaryTrace( lParam, TRACE_MESSAGE, pbData, cbData )
#define BinaryTrace( lParam, pbData, cbData ) \
!(__dwEnabledTraces & MESSAGE_TRACE_MASK) ? \ (void)0 : \ SetAsyncTraceParams( THIS_FILE, __LINE__, ___pszFunctionName, MESSAGE_TRACE_MASK ) && \ AsyncBinaryTrace( lParam, TRACE_BINARY, pbData, cbData )
#define UserTrace( lParam, dwUserType, pbData, cbData ) \
!(__dwEnabledTraces & MESSAGE_TRACE_MASK) ? \ (void)0 : \ SetAsyncTraceParams( THIS_FILE, __LINE__, ___pszFunctionName, MESSAGE_TRACE_MASK ) && \ AsyncBinaryTrace( lParam, dwUserType, pbData, cbData )
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// imported trace flag used by trace macros to determine if the trace
// statement should be executed
//
extern DWORD __dwEnabledTraces;
//
// import functions from ATRACE.LIB
//
BOOL InitAsyncTrace ( void ); BOOL TermAsyncTrace ( void ); BOOL FlushAsyncTrace( void );
void DebugAssert( DWORD dwLine, LPCSTR lpszFunction, LPCSTR lpszExpression );
int SetAsyncTraceParams( LPCSTR pszFile, int iLine, LPCSTR szFunction, DWORD dwTraceMask );
int AsyncStringTrace( LPARAM lParam, LPCSTR szFormat , va_list marker ); int AsyncBinaryTrace( LPARAM lParam, DWORD dwBinaryType, LPBYTE pbData, DWORD cbData );
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// Trace flag constants
//
#define FATAL_TRACE_MASK 0x00000001
#define ERROR_TRACE_MASK 0x00000002
#define DEBUG_TRACE_MASK 0x00000004
#define STATE_TRACE_MASK 0x00000008
#define FUNCT_TRACE_MASK 0x00000010
#define MESSAGE_TRACE_MASK 0x00000020
#define ALL_TRACE_MASK 0xFFFFFFFF
#define NUM_TRACE_TYPES 6
//
// Output trace types. used by tools to modify the
// registry to change the output target
//
enum tagTraceOutputTypes { TRACE_OUTPUT_DISABLED = 0, TRACE_OUTPUT_FILE = 1, TRACE_OUTPUT_DEBUG = 2, TRACE_OUTPUT_DISCARD = 4 // used to find race windows
};
#define TRACE_OUTPUT_INVALID \
~(TRACE_OUTPUT_FILE|TRACE_OUTPUT_DEBUG|TRACE_OUTPUT_DISCARD)
#define IsTraceFile(x) ((x) & TRACE_OUTPUT_FILE)
#define IsTraceDebug(x) ((x) & TRACE_OUTPUT_DEBUG)
#define IsTraceDiscard(x) ((x) & TRACE_OUTPUT_DISCARD)
//
// predefined types of binary trace types. User defined
// types must be greater than 0x8000
//
enum tagBinaryTypes { TRACE_STRING = 0, TRACE_BINARY, TRACE_MESSAGE, TRACE_USER = 0x8000 };
#include <stdarg.h>
//
// use __inline to ensure grab __LINE__ and __FILE__
//
__inline int WINAPIV PreAsyncTrace( LPARAM lParam, LPCSTR szFormat, ... ) { va_list marker; int iLength;
va_start( marker, szFormat ); iLength = AsyncStringTrace( lParam, szFormat, marker ); va_end( marker );
return iLength; }
// !defined(NOTRACE) from way at the top of this include file
#endif // !defined(NOTRACE)
// Asserts are independent of tracing
// (with the exception of flushing the trace buffer).
//
// For now enable ASSERT defines only if debugging is enabled
//
#ifdef DEBUG
#define _ENABLE_ASSERTS
#ifndef NOTRACE
#define _ENABLE_VERBOSE_ASSERTS
#endif // NO_TRACE
#endif // DEBUG
//
// Macros added for doing asserts and verifies. basic clones
// of the MFC macros with a prepended _ symbol
//
#ifdef _ENABLE_ASSERTS
#ifndef _ASSERT
#ifdef _ENABLE_VERBOSE_ASSERTS
#define _ASSERT(f) !(f) ? DebugAssert( __LINE__, THIS_FILE, #f ) : ((void)0)
#else
#define _ASSERT(f) !(f) ? DebugBreak() : ((void)0)
#endif //_ENABLE_VERBOSE_ASSERTS
#endif
#define _VERIFY(f) _ASSERT(f)
#else
#define _ASSERT(f) ((void)0)
#define _VERIFY(f) ((void)(f))
#endif // _ENABLE_ASSERTS
#ifdef __cplusplus
} // extern "C"
////////////////////////////////////////////////////////////////////////////////
#ifdef NOTRACE
#define TraceFunctEntry(sz)
#else
class CTraceEntry { public: CTraceEntry(char * psz) { this->___pszFunctionName = psz; FunctTrace( 0, "Entering %s", psz); } ~CTraceEntry() { FunctTrace( 0, "Leaving %s", this->___pszFunctionName); } char * ___pszFunctionName; };
#define TraceFunctEntry(sz) CTraceEntry __cte(sz)
#endif // NOTRACE
////////////////////////////////////////////////////////////////////////////////
#endif
#endif // !defined(_DBGTRACE_H_)
|