|
|
/*++
Copyright (c) 1996 Microsoft Corporation All rights reserved.
Module Name:
trace.hxx
Abstract:
Holds logging routines.
Author:
Albert Ting (AlbertT) 24-May-1996
Revision History:
--*/
#ifndef _TRACE_HXX
#define _TRACE_HXX
#ifdef __cplusplus
enum COMPARE { kLess = -1, kEqual = 0, kGreater = 1 };
extern CRITICAL_SECTION gcsBackTrace;
class TMemBlock;
class TBackTraceDB {
SIGNATURE( 'btdb' )
public:
enum CONSTANTS { kBlockSize = 0x4000 };
TBackTraceDB( VOID );
~TBackTraceDB( VOID );
BOOL bValid( VOID );
HANDLE hStore( ULONG ulHash, PVOID pvBackTrace );
private:
class TTrace { friend TDebugExt;
public:
COMPARE eCompareHash( ULONG ulHash ) const;
COMPARE eCompareBackTrace( PVOID pvBackTrace ) const;
static TTrace* pNew( TBackTraceDB *pBackTraceDB, ULONG ulHash, PVOID pvBackTrace, TTrace ** ppTrace );
VAR( TTrace*, pLeft ); VAR( TTrace*, pRight );
VAR( ULONG, ulHash ); PVOID apvBackTrace[1];
private:
//
// Don't allow instantiation.
//
TTrace(); ~TTrace(); };
TTrace* ptFind( ULONG ulHash, PVOID pvBackTrace, TTrace ***pppTrace );
TTrace *_pTraceHead; TMemBlock *_pMemBlock;
friend TTrace; friend TDebugExt; };
class VBackTrace { friend TDebugExt;
SIGNATURE( 'vbt' ) ALWAYS_VALID
public:
enum CONSTANTS { //
// fdwOptions.
//
kString = 0x1, kMaxDepth = 0xd };
VBackTrace( DWORD fdwOptions1 = 0, DWORD fdwOptions2 = 0 );
virtual ~VBackTrace( VOID );
virtual PVOID pvCapture( DWORD dwInfo1, DWORD dwInfo2, DWORD dwInfo3 = 0 ) = 0;
static BOOL bInit( VOID );
protected:
class TLine { public:
HANDLE _hTrace;
DWORD _dwInfo1; DWORD _dwInfo2; DWORD _dwInfo3; DWORD _dwThreadId; DWORD _dwTickCount;
PVOID _apvBackTrace[kMaxDepth+1]; };
DWORD _fdwOptions1; DWORD _fdwOptions2;
};
/********************************************************************
Backtracing to memory.
********************************************************************/
class TBackTraceMem : public VBackTrace { friend TDebugExt; friend VBackTrace;
SIGNATURE( 'btm' ) ALWAYS_VALID
public:
enum { kMaxCall = 0x800, kBlockSize = 0x4000 };
TBackTraceMem( DWORD fdwOptions1 = 0, DWORD fdwOptions2 = 0 );
~TBackTraceMem( VOID );
PVOID pvCapture( DWORD dwInfo1, DWORD dwInfo2, DWORD dwInfo3 = 0 );
private:
VOID vCaptureLine( TLine* pLine, DWORD dwInfo1, DWORD dwInfo2, DWORD dwInfo3 );
UINT _uNextFree; TLine* _pLines; };
/********************************************************************
Backtracing to file.
********************************************************************/
class TBackTraceFile : public VBackTrace { friend TDebugExt;
SIGNATURE( 'btf' ) ALWAYS_VALID
public:
TBackTraceFile( DWORD fdwOptions1 = 0, DWORD fdwOptions2 = 0 );
~TBackTraceFile( VOID );
PVOID pvCapture( DWORD dwInfo1, DWORD dwInfo2, DWORD dwInfo3 = 0 );
private:
enum { kMaxPath = MAX_PATH, kMaxLineStr = 512 };
HANDLE _hFile;
static COUNT gcInstances; };
#endif // #ifdef __cplusplus
#endif // #ifdef _TRACE_HXX
|