|
|
/**************************************************************************\
* * Copyright (c) 1998 Microsoft Corporation * * Module Name: * * debug.h * * Abstract: * * Macros used for debugging purposes * * Revision History: * * 12/02/1998 davidx * Created it. * \**************************************************************************/
#ifndef _DEBUG_H
#define _DEBUG_H
#ifdef __cplusplus
extern "C" { #endif
//
// These macros are used for debugging purposes. They expand
// to white spaces on a free build. Here is a brief description
// of what they do and how they are used:
//
// _debugLevel
// Global variable which set the current debug level to control
// the amount of debug messages emitted.
//
// VERBOSE(msg)
// Display a message if the current debug level is <= DBG_VERBOSE.
//
// TERSE(msg)
// Display a message if the current debug level is <= DBG_TERSE.
//
// WARNING(msg)
// Display a message if the current debug level is <= DBG_WARNING.
// The message format is: WRN filename (linenumber): message
//
// ASSERT(cond)
// Verify a condition is true. If not, force a breakpoint.
//
// ASSERTMSG(cond, msg)
// Verify a condition is true. If not, display a message and
// force a breakpoint.
//
// RIP(msg)
// Display a message and force a breakpoint.
//
// Usage:
//
// These macros require extra parantheses for the msg argument
// for example:
// WARNING(("App passed NULL pointer, ignoring...\n"));
// ASSERTMSG(x > 0, ("x is less than 0\n"));
//
#if DBG
// Global debug level
#define DBG_VERBOSE 1
#define DBG_TERSE 2
#define DBG_WARNING 3
#define DBG_RIP 4
extern INT _debugLevel;
//--------------------------------------------------------------------------
// Debug build for native DLL
//--------------------------------------------------------------------------
// Emit debug messages
ULONG DbgPrint(const CHAR*, ...);
// Strip the directory prefix from a filename
const CHAR* StripDirPrefix( const CHAR* filename );
#define DBGMSG(level, prefix, msg) \
do { \ if (_debugLevel <= (level)) \ { \ DbgPrint("%s %s (%d): ", prefix, StripDirPrefix(__FILE__), __LINE__); \ DbgPrint msg; \ } \ } while (0)
#define DBGPRINT(level, msg) \
do { \ if (_debugLevel <= (level)) \ { \ DbgPrint msg; \ } \ } while (0) #define VERBOSE(msg) DBGPRINT(DBG_VERBOSE, msg)
#define TERSE(msg) DBGPRINT(DBG_TERSE, msg)
#define WARNING(msg) DBGMSG(DBG_WARNING, "WRN", msg)
#define ASSERT(cond) \
do { \ if (! (cond)) \ { \ RIP(("\n")); \ } \ } while (0)
#define ASSERTMSG(cond, msg) \
do { \ if (! (cond)) \ { \ RIP(msg); \ } \ } while (0)
#define RIP(msg) \
do { \ DBGMSG(DBG_RIP, "RIP", msg); \ DebugBreak(); \ } while (0)
#define ENTERFUNC(func) VERBOSE(("%x:%x: Enter "##func##"\n", GetCurrentProcessId(), GetCurrentThreadId()))
#define LEAVEFUNC(func) VERBOSE(("%x:%x: Leave "##func##"\n", GetCurrentProcessId(), GetCurrentThreadId()))
#else // !DBG
//--------------------------------------------------------------------------
// Retail build
//--------------------------------------------------------------------------
#define DbgPrint
#define VERBOSE(msg)
#define TERSE(msg)
#define WARNING(msg)
#define ASSERT(cond)
#define ASSERTMSG(cond, msg)
#define RIP(msg)
#define DBGMSG(level, prefix, msg)
#define DBGPRINT(level, msg)
#define ENTERFUNC(func)
#define LEAVEFUNC(func)
#endif // !DBG
#ifdef __cplusplus
} #endif
#endif // !_DEBUG_H
|