| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: wx/msw/debughlp.h
- // Purpose: wraps dbghelp.h standard file
- // Author: Vadim Zeitlin
- // Modified by:
- // Created: 2005-01-08 (extracted from msw/crashrpt.cpp)
- // Copyright: (c) 2003-2005 Vadim Zeitlin <vadim@wxwindows.org>
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_MSW_DEBUGHLPH_H_
- #define _WX_MSW_DEBUGHLPH_H_
- #include "wx/dynlib.h"
- #include "wx/msw/wrapwin.h"
- #ifndef __WXWINCE__
- #include <imagehlp.h>
- #endif // __WXWINCE__
- #include "wx/msw/private.h"
- // All known versions of imagehlp.h define API_VERSION_NUMBER but it's not
- // documented, so deal with the possibility that it's not defined just in case.
- #ifndef API_VERSION_NUMBER
- #define API_VERSION_NUMBER 0
- #endif
- // wxUSE_DBGHELP is a bit special as it is not defined in wx/setup.h and we try
- // to auto-detect whether we should be using debug help API or not ourselves
- // below. However if the auto-detection fails, you can always predefine it as 0
- // to avoid even trying.
- #ifndef wxUSE_DBGHELP
- // The version of imagehlp.h from VC6 (7) is too old and is missing some
- // required symbols while the version from VC7 (9) is good enough. As we
- // don't know anything about version 8, don't use it unless we can test it.
- #if API_VERSION_NUMBER >= 9
- #define wxUSE_DBGHELP 1
- #else
- #define wxUSE_DBGHELP 0
- #endif
- #endif
- #if wxUSE_DBGHELP
- // ----------------------------------------------------------------------------
- // wxDbgHelpDLL: dynamically load dbghelp.dll functions
- // ----------------------------------------------------------------------------
- // wrapper for some functions from dbghelp.dll
- //
- // MT note: this class is not MT safe and should be only used from a single
- // thread at a time (this is so because dbghelp.dll is not MT-safe
- // itself anyhow)
- class wxDbgHelpDLL
- {
- public:
- // some useful constants not present in debughlp.h (stolen from DIA SDK)
- enum BasicType
- {
- BASICTYPE_NOTYPE = 0,
- BASICTYPE_VOID = 1,
- BASICTYPE_CHAR = 2,
- BASICTYPE_WCHAR = 3,
- BASICTYPE_INT = 6,
- BASICTYPE_UINT = 7,
- BASICTYPE_FLOAT = 8,
- BASICTYPE_BCD = 9,
- BASICTYPE_BOOL = 10,
- BASICTYPE_LONG = 13,
- BASICTYPE_ULONG = 14,
- BASICTYPE_CURRENCY = 25,
- BASICTYPE_DATE = 26,
- BASICTYPE_VARIANT = 27,
- BASICTYPE_COMPLEX = 28,
- BASICTYPE_BIT = 29,
- BASICTYPE_BSTR = 30,
- BASICTYPE_HRESULT = 31,
- BASICTYPE_MAX
- };
- enum SymbolTag
- {
- SYMBOL_TAG_NULL,
- SYMBOL_TAG_EXE,
- SYMBOL_TAG_COMPILAND,
- SYMBOL_TAG_COMPILAND_DETAILS,
- SYMBOL_TAG_COMPILAND_ENV,
- SYMBOL_TAG_FUNCTION,
- SYMBOL_TAG_BLOCK,
- SYMBOL_TAG_DATA,
- SYMBOL_TAG_ANNOTATION,
- SYMBOL_TAG_LABEL,
- SYMBOL_TAG_PUBLIC_SYMBOL,
- SYMBOL_TAG_UDT,
- SYMBOL_TAG_ENUM,
- SYMBOL_TAG_FUNCTION_TYPE,
- SYMBOL_TAG_POINTER_TYPE,
- SYMBOL_TAG_ARRAY_TYPE,
- SYMBOL_TAG_BASE_TYPE,
- SYMBOL_TAG_TYPEDEF,
- SYMBOL_TAG_BASE_CLASS,
- SYMBOL_TAG_FRIEND,
- SYMBOL_TAG_FUNCTION_ARG_TYPE,
- SYMBOL_TAG_FUNC_DEBUG_START,
- SYMBOL_TAG_FUNC_DEBUG_END,
- SYMBOL_TAG_USING_NAMESPACE,
- SYMBOL_TAG_VTABLE_SHAPE,
- SYMBOL_TAG_VTABLE,
- SYMBOL_TAG_CUSTOM,
- SYMBOL_TAG_THUNK,
- SYMBOL_TAG_CUSTOM_TYPE,
- SYMBOL_TAG_MANAGED_TYPE,
- SYMBOL_TAG_DIMENSION,
- SYMBOL_TAG_MAX
- };
- enum DataKind
- {
- DATA_UNKNOWN,
- DATA_LOCAL,
- DATA_STATIC_LOCAL,
- DATA_PARAM,
- DATA_OBJECT_PTR, // "this" pointer
- DATA_FILE_STATIC,
- DATA_GLOBAL,
- DATA_MEMBER,
- DATA_STATIC_MEMBER,
- DATA_CONSTANT,
- DATA_MAX
- };
- enum UdtKind
- {
- UDT_STRUCT,
- UDT_CLASS,
- UDT_UNION,
- UDT_MAX
- };
- // function types
- typedef DWORD (WINAPI *SymGetOptions_t)();
- typedef DWORD (WINAPI *SymSetOptions_t)(DWORD);
- typedef BOOL (WINAPI *SymInitialize_t)(HANDLE, LPSTR, BOOL);
- typedef BOOL (WINAPI *StackWalk_t)(DWORD, HANDLE, HANDLE, LPSTACKFRAME,
- LPVOID, PREAD_PROCESS_MEMORY_ROUTINE,
- PFUNCTION_TABLE_ACCESS_ROUTINE,
- PGET_MODULE_BASE_ROUTINE,
- PTRANSLATE_ADDRESS_ROUTINE);
- typedef BOOL (WINAPI *SymFromAddr_t)(HANDLE, DWORD64, PDWORD64, PSYMBOL_INFO);
- typedef LPVOID (WINAPI *SymFunctionTableAccess_t)(HANDLE, DWORD_PTR);
- typedef DWORD_PTR (WINAPI *SymGetModuleBase_t)(HANDLE, DWORD_PTR);
- typedef BOOL (WINAPI *SymGetLineFromAddr_t)(HANDLE, DWORD_PTR,
- PDWORD, PIMAGEHLP_LINE);
- typedef BOOL (WINAPI *SymSetContext_t)(HANDLE, PIMAGEHLP_STACK_FRAME,
- PIMAGEHLP_CONTEXT);
- typedef BOOL (WINAPI *SymEnumSymbols_t)(HANDLE, ULONG64, PCSTR,
- PSYM_ENUMERATESYMBOLS_CALLBACK, PVOID);
- typedef BOOL (WINAPI *SymGetTypeInfo_t)(HANDLE, DWORD64, ULONG,
- IMAGEHLP_SYMBOL_TYPE_INFO, PVOID);
- typedef BOOL (WINAPI *SymCleanup_t)(HANDLE);
- typedef BOOL (WINAPI *EnumerateLoadedModules_t)(HANDLE, PENUMLOADED_MODULES_CALLBACK, PVOID);
- typedef BOOL (WINAPI *MiniDumpWriteDump_t)(HANDLE, DWORD, HANDLE,
- MINIDUMP_TYPE,
- CONST PMINIDUMP_EXCEPTION_INFORMATION,
- CONST PMINIDUMP_USER_STREAM_INFORMATION,
- CONST PMINIDUMP_CALLBACK_INFORMATION);
- // The macro called by wxDO_FOR_ALL_SYM_FUNCS() below takes 2 arguments:
- // the name of the function in the program code, which never has "64"
- // suffix, and the name of the function in the DLL which can have "64"
- // suffix in some cases. These 2 helper macros call the macro with the
- // correct arguments in both cases.
- #define wxSYM_CALL(what, name) what(name, name)
- #if defined(_M_AMD64)
- #define wxSYM_CALL_64(what, name) what(name, name ## 64)
- // Also undo all the "helpful" definitions done by imagehlp.h that map 32
- // bit functions to 64 bit ones, we don't need this as we do it ourselves.
- #undef StackWalk
- #undef SymFunctionTableAccess
- #undef SymGetModuleBase
- #undef SymGetLineFromAddr
- #undef EnumerateLoadedModules
- #else
- #define wxSYM_CALL_64(what, name) what(name, name)
- #endif
- #define wxDO_FOR_ALL_SYM_FUNCS(what) \
- wxSYM_CALL_64(what, StackWalk); \
- wxSYM_CALL_64(what, SymFunctionTableAccess); \
- wxSYM_CALL_64(what, SymGetModuleBase); \
- wxSYM_CALL_64(what, SymGetLineFromAddr); \
- wxSYM_CALL_64(what, EnumerateLoadedModules); \
- \
- wxSYM_CALL(what, SymGetOptions); \
- wxSYM_CALL(what, SymSetOptions); \
- wxSYM_CALL(what, SymInitialize); \
- wxSYM_CALL(what, SymFromAddr); \
- wxSYM_CALL(what, SymSetContext); \
- wxSYM_CALL(what, SymEnumSymbols); \
- wxSYM_CALL(what, SymGetTypeInfo); \
- wxSYM_CALL(what, SymCleanup); \
- wxSYM_CALL(what, MiniDumpWriteDump)
- #define wxDECLARE_SYM_FUNCTION(func, name) static func ## _t func
- wxDO_FOR_ALL_SYM_FUNCS(wxDECLARE_SYM_FUNCTION);
- #undef wxDECLARE_SYM_FUNCTION
- // load all functions from DLL, return true if ok
- static bool Init();
- // return the string with the error message explaining why Init() failed
- static const wxString& GetErrorMessage();
- // log error returned by the given function to debug output
- static void LogError(const wxChar *func);
- // return textual representation of the value of given symbol
- static wxString DumpSymbol(PSYMBOL_INFO pSymInfo, void *pVariable);
- // return the name of the symbol with given type index
- static wxString GetSymbolName(PSYMBOL_INFO pSymInfo);
- private:
- // dereference the given symbol, i.e. return symbol which is not a
- // pointer/reference any more
- //
- // if ppData != NULL, dereference the pointer as many times as we
- // dereferenced the symbol
- //
- // return the tag of the dereferenced symbol
- static SymbolTag DereferenceSymbol(PSYMBOL_INFO pSymInfo, void **ppData);
- static wxString DumpField(PSYMBOL_INFO pSymInfo,
- void *pVariable,
- unsigned level);
- static wxString DumpBaseType(BasicType bt, DWORD64 length, void *pVariable);
- static wxString DumpUDT(PSYMBOL_INFO pSymInfo,
- void *pVariable,
- unsigned level = 0);
- };
- #endif // wxUSE_DBGHELP
- #endif // _WX_MSW_DEBUGHLPH_H_
|