1 /* This file contains debugging utilities used only under VC2005+ 2 * Maintained by: portej05 (please run patches past him before committing here!) 3 */ 4 5 /* You will need to define PDB_DEBUGGING in order to use these functions 6 * Important note: 7 * When you call SCP_DumpStack, your thread will be suspended until the stack is dumped 8 * If you've got more than a single thread 9 */ 10 11 /* Things you should be using from this header 12 * SCP_IDumpHandler - implement this in order to receive symbols from DumpStack 13 */ 14 15 #ifndef _MSPDB_CALLSTACK_H_INCLUDED_ 16 #define _MSPDB_CALLSTACK_H_INCLUDED_ 17 18 #if defined(PDB_DEBUGGING) 19 20 /* Must have windows.h */ 21 #include <windows.h> 22 23 #ifndef PURE 24 # define PURE = 0 25 #endif 26 27 /* PUBLIC - use these */ 28 29 /* This interface will be used by the stack tracing code 30 * to return symbols 31 */ 32 class SCP_IDumpHandler abstract 33 { 34 public: 35 virtual bool ResolveSymbols( ) PURE; 36 virtual void OnBegin( ) PURE; 37 virtual void OnEntry( void* address, const char* module, const char* symbol ) PURE; 38 virtual void OnError( const char* error ) PURE; 39 virtual void OnEnd( ) PURE; 40 }; 41 42 extern HRESULT SCP_DumpStack( SCP_IDumpHandler* pISH ); 43 44 /* INTERNAL - please don't use these */ 45 #define SCP_MSPDBCS_MAX_SYMBOL_LENGTH 1000 46 #define SCP_MSPDBCS_MAX_MODULE_LENGTH _MAX_PATH 47 #define SCP_MSPDBCS_MAX_STACK_FRAMES 100 /* arbitrary */ 48 49 struct SCP_mspdbcs_SDumpStackThreadInfo 50 { 51 HANDLE hThread; 52 HANDLE hProcess; 53 SCP_IDumpHandler* pIDS; 54 }; 55 56 struct SCP_mspdbcs_SDumpStackSymbolInfo 57 { 58 ULONG_PTR dwAddress; 59 DWORD64 dwOffset; /* Will be truncated to DWORD under Win32 */ 60 char szModule[ SCP_MSPDBCS_MAX_MODULE_LENGTH ]; 61 char szSymbol[ SCP_MSPDBCS_MAX_SYMBOL_LENGTH ]; 62 }; 63 64 /* INTERNAL FUNCTIONS */ 65 extern BOOL SCP_mspdbcs_ResolveSymbol( HANDLE hProcess, UINT_PTR dwAddress, SCP_mspdbcs_SDumpStackThreadInfo& siSymbol ); 66 extern LPVOID __stdcall SCP_mspdbcs_FunctionTableAccess( HANDLE hProcess, DWORD64 dwPCAddress ); 67 extern DWORD64 __stdcall SCP_mspdbcs_GetModuleBase( HANDLE hProcess, DWORD64 returnAddress ); 68 extern DWORD WINAPI SCP_mspdbcs_DumpStackThread( LPVOID pv ); 69 70 #endif // PDB_DEBUGGING 71 72 /* Initialisation */ 73 extern void SCP_mspdbcs_Initialise( ); 74 extern void SCP_mspdbcs_Cleanup( ); 75 76 #endif // _MSPDB_CALLSTACK_H_INCLUDED_ 77