254 lines
7.2 KiB
C++
254 lines
7.2 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997.
|
|
//
|
|
// File: T R A C E . H
|
|
//
|
|
// Contents: Class definition for CTracing
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: jeffspr 15 Apr 1997
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include "tracetag.h"
|
|
#include "stldeque.h"
|
|
|
|
#ifdef ENABLETRACE
|
|
|
|
// This is needed for TraceHr, since we can't use a macro (vargs), but we
|
|
// need to get the file and line from the source.
|
|
#define FAL __FILE__,__LINE__,__FUNCTION__
|
|
|
|
// The Trace Stack functions
|
|
#if defined (_IA64_)
|
|
#include <ia64reg.h>
|
|
|
|
extern "C" unsigned __int64 __getReg(int whichReg);
|
|
extern "C" void __setReg(int whichReg, __int64 value);
|
|
#pragma intrinsic(__getReg)
|
|
#pragma intrinsic(__setReg)
|
|
|
|
#define GetR32 __getReg(CV_IA64_IntR32)
|
|
#define GetR33 __getReg(CV_IA64_IntR33)
|
|
#define GetR34 __getReg(CV_IA64_IntR34)
|
|
#endif // defined(_IA64_)
|
|
|
|
class CTracingIndent;
|
|
|
|
class CTracingFuncCall
|
|
{
|
|
public:
|
|
#if defined (_X86_)
|
|
CTracingFuncCall(LPCSTR szFunctionName, LPCSTR szFunctionDName, LPCSTR szFile, const DWORD dwLine, const DWORD dwFramePointer);
|
|
#elif defined (_IA64_)
|
|
CTracingFuncCall(LPCSTR szFunctionName, LPCSTR szFunctionDName, LPCSTR szFile, const DWORD dwLine, const __int64 Args1, const __int64 Args2, const __int64 Args3);
|
|
#else
|
|
CTracingFuncCall(LPCSTR szFunctionName, LPCSTR szFunctionDName, LPCSTR szFile, const DWORD dwLine);
|
|
#endif
|
|
|
|
CTracingFuncCall(const CTracingFuncCall& TracingFuncCall);
|
|
~CTracingFuncCall();
|
|
|
|
public:
|
|
LPSTR m_szFunctionName;
|
|
LPSTR m_szFunctionDName;
|
|
LPSTR m_szFile;
|
|
DWORD m_dwLine;
|
|
|
|
#if defined (_X86_)
|
|
DWORD m_arguments[3];
|
|
#elif defined (_IA64_ )
|
|
__int64 m_arguments[3];
|
|
#else
|
|
// ... add other processors here
|
|
#endif
|
|
|
|
DWORD m_dwFramePointer;
|
|
DWORD m_dwThreadId;
|
|
|
|
friend CTracingIndent;
|
|
};
|
|
|
|
class CTracingThreadInfo
|
|
{
|
|
public:
|
|
CTracingThreadInfo();
|
|
~CTracingThreadInfo();
|
|
|
|
public:
|
|
LPVOID m_pfnStack;
|
|
DWORD m_dwLevel;
|
|
DWORD m_dwThreadId;
|
|
friend CTracingIndent;
|
|
};
|
|
|
|
class CTracingIndent
|
|
{
|
|
LPSTR m_szFunctionDName;
|
|
DWORD m_dwFramePointer;
|
|
BOOL bFirstTrace;
|
|
|
|
public:
|
|
#if defined (_X86_)
|
|
void AddTrace(LPCSTR szFunctionName, LPCSTR szFunctionDName, LPCSTR szFile, const DWORD dwLine, const DWORD dwFramePointer);
|
|
#elif defined (_IA64_)
|
|
void AddTrace(LPCSTR szFunctionName, LPCSTR szFunctionDName, LPCSTR szFile, const DWORD dwLine, const __int64 Args1, const __int64 Args2, const __int64 Args3);
|
|
#else
|
|
void AddTrace(LPCSTR szFunctionName, LPCSTR szFunctionDName, LPCSTR szFile, const DWORD dwLine);
|
|
#endif
|
|
void RemoveTrace(LPCSTR szFunctionDName, const DWORD dwFramePointer);
|
|
|
|
CTracingIndent();
|
|
~CTracingIndent();
|
|
|
|
static CTracingThreadInfo* GetThreadInfo();
|
|
static DWORD getspaces();
|
|
static void TraceStackFn(TRACETAGID TraceTagId);
|
|
};
|
|
|
|
|
|
#define IDENT_ADD2(x) indent ## x
|
|
#define IDENT_ADD(x) IDENT_ADD2(x)
|
|
#define __INDENT__ IDENT_ADD(__LINE__)
|
|
|
|
#define FP_ADD2(x) FP ## x
|
|
#define FP_ADD(x) FP_ADD2(x)
|
|
#define __FP__ FP_ADD(__LINE__)
|
|
|
|
#if defined (_X86_)
|
|
#define AddTraceLevel \
|
|
__if_not_exists(NetCfgFramePointer) \
|
|
{ \
|
|
DWORD NetCfgFramePointer; \
|
|
BOOL fForceC4715Check = TRUE; \
|
|
} \
|
|
if (fForceC4715Check) \
|
|
{ \
|
|
__asm { mov NetCfgFramePointer, ebp }; \
|
|
} \
|
|
__if_not_exists(NetCfgIndent) \
|
|
{ \
|
|
CTracingIndent NetCfgIndent; \
|
|
} \
|
|
NetCfgIndent.AddTrace(__FUNCTION__, __FUNCDNAME__, __FILE__, __LINE__, NetCfgFramePointer);
|
|
#elif defined (_IA64_)
|
|
#define AddTraceLevel \
|
|
__if_not_exists(NetCfgIndent) \
|
|
{ \
|
|
CTracingIndent NetCfgIndent; \
|
|
} \
|
|
NetCfgIndent.AddTrace(__FUNCTION__, __FUNCDNAME__, __FILE__, __LINE__, GetR32, GetR33, GetR34);
|
|
#else
|
|
#define AddTraceLevel \
|
|
__if_not_exists(NetCfgIndent) \
|
|
{ \
|
|
CTracingIndent NetCfgIndent; \
|
|
} \
|
|
NetCfgIndent.AddTrace(__FUNCTION__, __FUNCDNAME__, __FILE__, __LINE__);
|
|
#endif
|
|
|
|
// Trace error functions. The leaading _ is to establish the real function,
|
|
// while adding a new macro so we can add __FILE__ and __LINE__ to the output.
|
|
//
|
|
VOID WINAPI TraceErrorFn (PCSTR pszaFile, INT nLine, PCSTR psza, HRESULT hr);
|
|
VOID WINAPI TraceErrorOptionalFn (PCSTR pszaFile, INT nLine, PCSTR psza, HRESULT hr, BOOL fOpt);
|
|
VOID WINAPI TraceErrorSkipFn (PCSTR pszaFile, INT nLine, PCSTR psza, HRESULT hr, UINT c, ...);
|
|
VOID WINAPIV TraceLastWin32ErrorFn (PCSTR pszaFile, INT nLine, PCSTR psza);
|
|
|
|
#define TraceError(sz, hr) TraceErrorFn(__FILE__, __LINE__, sz, hr);
|
|
#define TraceErrorOptional(sz, hr, _bool) TraceErrorOptionalFn(__FILE__, __LINE__, sz, hr, _bool);
|
|
#define TraceErrorSkip1(sz, hr, hr1) TraceErrorSkipFn(__FILE__, __LINE__, sz, hr, 1, hr1);
|
|
#define TraceErrorSkip2(sz, hr, hr1, hr2) TraceErrorSkipFn(__FILE__, __LINE__, sz, hr, 2, hr1, hr2);
|
|
#define TraceErrorSkip3(sz, hr, hr1, hr2, hr3) TraceErrorSkipFn(__FILE__, __LINE__, sz, hr, 3, hr1, hr2, hr3);
|
|
#define TraceLastWin32Error(sz) TraceLastWin32ErrorFn(__FILE__,__LINE__, sz);
|
|
|
|
VOID
|
|
WINAPIV
|
|
TraceHrFn (
|
|
TRACETAGID ttid,
|
|
PCSTR pszaFile,
|
|
INT nLine,
|
|
HRESULT hr,
|
|
BOOL fIgnore,
|
|
PCSTR pszaFmt,
|
|
...);
|
|
|
|
VOID
|
|
WINAPIV
|
|
TraceHrFn (
|
|
TRACETAGID ttid,
|
|
PCSTR pszaFile,
|
|
INT nLine,
|
|
PCSTR pszaFunc,
|
|
HRESULT hr,
|
|
BOOL fIgnore,
|
|
PCSTR pszaFmt,
|
|
...);
|
|
|
|
VOID
|
|
WINAPIV
|
|
TraceTagFn (
|
|
TRACETAGID ttid,
|
|
PCSTR pszaFmt,
|
|
...);
|
|
|
|
VOID
|
|
WINAPIV
|
|
TraceFileFuncFn (
|
|
TRACETAGID ttid);
|
|
|
|
#define TraceFileFunc(ttidWhich) AddTraceLevel; TraceFileFuncFn(ttidWhich);
|
|
#define TraceStack(ttidWhich) AddTraceLevel; CTracingIndent::TraceStackFn(ttidWhich);
|
|
#define TraceHr AddTraceLevel; TraceHrFn
|
|
#define TraceTag AddTraceLevel; TraceTagFn
|
|
|
|
#define TraceException(hr, szExceptionName) TraceHr(ttidError, FAL, hr, FALSE, "A (%s) exception occurred", szExceptionName);
|
|
|
|
LPCSTR DbgEvents(DWORD Event);
|
|
LPCSTR DbgEventManager(DWORD EventManager);
|
|
LPCSTR DbgNcm(DWORD ncm);
|
|
LPCSTR DbgNcs(DWORD ncs);
|
|
LPCSTR DbgNccf(DWORD nccf);
|
|
LPCSTR DbgNcsm(DWORD ncsm);
|
|
|
|
#else // !ENABLETRACE
|
|
|
|
#define FAL (void)0
|
|
#define TraceError(_sz, _hr)
|
|
#define TraceErrorOptional(_sz, _hr, _bool)
|
|
#define TraceErrorSkip1(_sz, _hr, _hr1)
|
|
#define TraceErrorSkip2(_sz, _hr, _hr1, _hr2)
|
|
#define TraceErrorSkip3(_sz, _hr, _hr1, _hr2, _hr3)
|
|
#define TraceLastWin32Error(_sz)
|
|
#define TraceHr NOP_FUNCTION
|
|
#define TraceTag NOP_FUNCTION
|
|
#define TraceFileFunc(ttidWhich) NOP_FUNCTION
|
|
#define TraceException(hr, szExceptionName) NOP_FUNCTION
|
|
#define TraceStack(ttidWhich) NOP_FUNCTION
|
|
|
|
#define DbgEvents(Event) ""
|
|
#define DbgEventManager(EventManager) ""
|
|
#define DbgNcm(ncm) ""
|
|
#define DbgNcs(ncs) ""
|
|
#define DbgNccf(nccf) ""
|
|
#define DbgNcsm(nccf) ""
|
|
|
|
#endif // ENABLETRACE
|
|
|
|
#ifdef ENABLETRACE
|
|
|
|
|
|
//---[ Initialization stuff ]-------------------------------------------------
|
|
|
|
HRESULT HrInitTracing();
|
|
HRESULT HrUnInitTracing();
|
|
HRESULT HrOpenTraceUI(HWND hwndOwner);
|
|
|
|
#endif // ENABLETRACE
|
|
|