1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: wx/msw/wrapdbgh.h
3 // Purpose: wraps dbghelp.h standard file
4 // Author: Vadim Zeitlin
6 // Created: 2005-01-08 (extracted from msw/crashrpt.cpp)
8 // Copyright: (c) 2003-2005 Vadim Zeitlin <vadim@wxwindows.org>
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_MSW_DEBUGHLPH_H_
13 #define _WX_MSW_DEBUGHLPH_H_
15 #include "wx/dynlib.h"
17 #include "wx/msw/wrapwin.h"
21 #include "wx/msw/private.h"
23 // we need to determine whether we have the declarations for the function in
24 // debughlp.dll version 5.81 (at least) and we check for DBHLPAPI to test this
27 // - VC6 version of imagehlp.h doesn't define it
29 // - testing for compiler version doesn't work as you can install and use
30 // the new SDK headers with VC6
32 // in any case, the user may override by defining wxUSE_DBGHELP himself
35 #define wxUSE_DBGHELP 1
37 #define wxUSE_DBGHELP 0
43 // ----------------------------------------------------------------------------
44 // wxDbgHelpDLL: dynamically load dbghelp.dll functions
45 // ----------------------------------------------------------------------------
47 // wrapper for some functions from dbghelp.dll
49 // MT note: this class is not MT safe and should be only used from a single
50 // thread at a time (this is so because dbghelp.dll is not MT-safe
55 // some useful constants not present in debughlp.h (stolen from DIA SDK)
69 BASICTYPE_CURRENCY
= 25,
71 BASICTYPE_VARIANT
= 27,
72 BASICTYPE_COMPLEX
= 28,
75 BASICTYPE_HRESULT
= 31,
84 SYMBOL_TAG_COMPILAND_DETAILS
,
85 SYMBOL_TAG_COMPILAND_ENV
,
89 SYMBOL_TAG_ANNOTATION
,
91 SYMBOL_TAG_PUBLIC_SYMBOL
,
94 SYMBOL_TAG_FUNCTION_TYPE
,
95 SYMBOL_TAG_POINTER_TYPE
,
96 SYMBOL_TAG_ARRAY_TYPE
,
99 SYMBOL_TAG_BASE_CLASS
,
101 SYMBOL_TAG_FUNCTION_ARG_TYPE
,
102 SYMBOL_TAG_FUNC_DEBUG_START
,
103 SYMBOL_TAG_FUNC_DEBUG_END
,
104 SYMBOL_TAG_USING_NAMESPACE
,
105 SYMBOL_TAG_VTABLE_SHAPE
,
109 SYMBOL_TAG_CUSTOM_TYPE
,
110 SYMBOL_TAG_MANAGED_TYPE
,
111 SYMBOL_TAG_DIMENSION
,
121 DATA_OBJECT_PTR
, // "this" pointer
140 typedef DWORD (WINAPI
*SymGetOptions_t
)();
141 typedef DWORD (WINAPI
*SymSetOptions_t
)(DWORD
);
142 typedef BOOL (WINAPI
*SymInitialize_t
)(HANDLE
, LPSTR
, BOOL
);
143 typedef BOOL (WINAPI
*StackWalk_t
)(DWORD
, HANDLE
, HANDLE
, LPSTACKFRAME
,
144 LPVOID
, PREAD_PROCESS_MEMORY_ROUTINE
,
145 PFUNCTION_TABLE_ACCESS_ROUTINE
,
146 PGET_MODULE_BASE_ROUTINE
,
147 PTRANSLATE_ADDRESS_ROUTINE
);
148 typedef BOOL (WINAPI
*SymFromAddr_t
)(HANDLE
, DWORD64
, PDWORD64
, PSYMBOL_INFO
);
149 typedef LPVOID (WINAPI
*SymFunctionTableAccess_t
)(HANDLE
, DWORD
);
150 typedef DWORD (WINAPI
*SymGetModuleBase_t
)(HANDLE
, DWORD
);
151 typedef BOOL (WINAPI
*SymGetLineFromAddr_t
)(HANDLE
, DWORD
,
152 PDWORD
, PIMAGEHLP_LINE
);
153 typedef BOOL (WINAPI
*SymSetContext_t
)(HANDLE
, PIMAGEHLP_STACK_FRAME
,
155 typedef BOOL (WINAPI
*SymEnumSymbols_t
)(HANDLE
, ULONG64
, PCSTR
,
156 PSYM_ENUMERATESYMBOLS_CALLBACK
, PVOID
);
157 typedef BOOL (WINAPI
*SymGetTypeInfo_t
)(HANDLE
, DWORD64
, ULONG
,
158 IMAGEHLP_SYMBOL_TYPE_INFO
, PVOID
);
159 typedef BOOL (WINAPI
*SymCleanup_t
)(HANDLE
);
160 typedef BOOL (WINAPI
*EnumerateLoadedModules_t
)(HANDLE
, PENUMLOADED_MODULES_CALLBACK
, PVOID
);
161 typedef BOOL (WINAPI
*MiniDumpWriteDump_t
)(HANDLE
, DWORD
, HANDLE
,
163 CONST PMINIDUMP_EXCEPTION_INFORMATION
,
164 CONST PMINIDUMP_USER_STREAM_INFORMATION
,
165 CONST PMINIDUMP_CALLBACK_INFORMATION
);
167 #define wxDO_FOR_ALL_SYM_FUNCS(what) \
168 what(SymGetOptions); \
169 what(SymSetOptions); \
170 what(SymInitialize); \
173 what(SymFunctionTableAccess); \
174 what(SymGetModuleBase); \
175 what(SymGetLineFromAddr); \
176 what(SymSetContext); \
177 what(SymEnumSymbols); \
178 what(SymGetTypeInfo); \
180 what(EnumerateLoadedModules); \
181 what(MiniDumpWriteDump)
183 #define wxDECLARE_SYM_FUNCTION(func) static func ## _t func
185 wxDO_FOR_ALL_SYM_FUNCS(wxDECLARE_SYM_FUNCTION
);
187 #undef wxDECLARE_SYM_FUNCTION
189 // load all functions from DLL, return true if ok
192 // return the string with the error message explaining why Init() failed
193 static const wxString
& GetErrorMessage();
195 // log error returned by the given function to debug output
196 static void LogError(const wxChar
*func
);
198 // return textual representation of the value of given symbol
199 static wxString
DumpSymbol(PSYMBOL_INFO pSymInfo
, void *pVariable
);
201 // return the name of the symbol with given type index
202 static wxString
GetSymbolName(PSYMBOL_INFO pSymInfo
);
205 // dereference the given symbol, i.e. return symbol which is not a
206 // pointer/reference any more
208 // if ppData != NULL, dereference the pointer as many times as we
209 // dereferenced the symbol
211 // return the tag of the dereferenced symbol
212 static SymbolTag
DereferenceSymbol(PSYMBOL_INFO pSymInfo
, void **ppData
);
214 static wxString
DumpField(PSYMBOL_INFO pSymInfo
,
218 static wxString
DumpBaseType(BasicType bt
, DWORD64 length
, void *pVariable
);
220 static wxString
DumpUDT(PSYMBOL_INFO pSymInfo
,
225 #endif // wxUSE_DBGHELP
227 #endif // _WX_MSW_DEBUGHLPH_H_