X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9ed0d735d588f42485461ea526596436c4c6ad4b..68d31398dd70c5c9ba7c8cc1a21bcf08eeba78f6:/src/msw/crashrpt.cpp diff --git a/src/msw/crashrpt.cpp b/src/msw/crashrpt.cpp index f49d2c0d48..eaccaeafce 100644 --- a/src/msw/crashrpt.cpp +++ b/src/msw/crashrpt.cpp @@ -44,6 +44,26 @@ #include #include "wx/msw/private.h" +// we need to determine whether we have the declarations for the function in +// debughlp.dll version 5.81 (at least) and we check for DBHLPAPI to test this +// +// reasons: +// - VC6 version of imagehlp.h doesn't define it +// - VC7 one does +// - testing for compiler version doesn't work as you can install and use +// the new SDK headers with VC6 +// +// in any case, the user may override by defining wxUSE_DBGHELP himself +#ifndef wxUSE_DBGHELP + #ifdef DBHLPAPI + #define wxUSE_DBGHELP 1 + #else + #define wxUSE_DBGHELP 0 + #endif +#endif + +#if wxUSE_DBGHELP + // ---------------------------------------------------------------------------- // types of imagehlp.h functions // ---------------------------------------------------------------------------- @@ -111,6 +131,8 @@ enum SymbolTag SYMBOL_TAG_BASECLASS }; +#endif // wxUSE_DBGHELP + // ---------------------------------------------------------------------------- // classes // ---------------------------------------------------------------------------- @@ -138,6 +160,7 @@ private: // output end of line void OutputEndl() { Output(_T("\r\n")); } +#if wxUSE_DBGHELP // translate exception code to its symbolic name static wxString GetExceptionString(DWORD dwCode); @@ -203,9 +226,6 @@ private: void OutputGlobals(HANDLE hModuleCrash); - // the handle of the report file - HANDLE m_hFile; - // the current stack frame (may be NULL) STACKFRAME *m_sfCurrent; @@ -223,6 +243,10 @@ private: DECLARE_SYM_FUNCTION(SymSetContext); DECLARE_SYM_FUNCTION(SymEnumSymbols); DECLARE_SYM_FUNCTION(SymGetTypeInfo); +#endif // wxUSE_DBGHELP + + // the handle of the report file + HANDLE m_hFile; }; // ---------------------------------------------------------------------------- @@ -243,6 +267,8 @@ static wxChar gs_reportFilename[MAX_PATH]; // implementation // ============================================================================ +#if wxUSE_DBGHELP + #define DEFINE_SYM_FUNCTION(func) func ## _t wxCrashReportImpl::func = 0 DEFINE_SYM_FUNCTION(SymSetOptions); @@ -258,13 +284,17 @@ DEFINE_SYM_FUNCTION(SymGetTypeInfo); #undef DEFINE_SYM_FUNCTION +#endif // wxUSE_DBGHELP + // ---------------------------------------------------------------------------- // wxCrashReportImpl // ---------------------------------------------------------------------------- wxCrashReportImpl::wxCrashReportImpl(const wxChar *filename) { +#if wxUSE_DBGHELP m_sfCurrent = NULL; +#endif // wxUSE_DBGHELP m_hFile = ::CreateFile ( @@ -291,6 +321,8 @@ void wxCrashReportImpl::Output(const wxChar *format, ...) va_end(argptr); } +#if wxUSE_DBGHELP + bool wxCrashReportImpl::GetLogicalAddress(PVOID addr, PTSTR szModule, @@ -908,61 +940,6 @@ bool wxCrashReportImpl::ResolveSymFunctions(const wxDynamicLibrary& dllDbgHelp) return true; } -bool wxCrashReportImpl::Generate(int flags) -{ - if ( m_hFile == INVALID_HANDLE_VALUE ) - return false; - - if ( !wxGlobalSEInformation ) - return false; - - PEXCEPTION_RECORD pExceptionRecord = wxGlobalSEInformation->ExceptionRecord; - PCONTEXT pCtx = wxGlobalSEInformation->ContextRecord; - - if ( !pExceptionRecord || !pCtx ) - return false; - - HANDLE hModuleCrash = OutputBasicContext(pExceptionRecord, pCtx); - - // for everything else we need dbghelp.dll - wxDynamicLibrary dllDbgHelp(_T("dbghelp.dll"), wxDL_VERBATIM); - if ( dllDbgHelp.IsLoaded() ) - { - if ( ResolveSymFunctions(dllDbgHelp) ) - { - SymSetOptions(SYMOPT_DEFERRED_LOADS); - - // Initialize DbgHelp - if ( SymInitialize(GetCurrentProcess(), NULL, TRUE /* invade */) ) - { - OutputStack(pCtx, flags); - - if ( hModuleCrash && (flags & wxCRASH_REPORT_GLOBALS) ) - { - OutputGlobals(hModuleCrash); - } - - return true; - } - } - else - { - Output(_T("Please update your dbghelp.dll version, " - "at least version 5.1 is needed!\r\n")); - } - } - else - { - Output(_T("Please install dbghelp.dll available free of charge ") - _T("from Microsoft to get more detailed crash information!")); - } - - Output(_T("\r\nLatest dbghelp.dll is available at " - "http://www.microsoft.com/whdc/ddk/debugging/\r\n")); - - return true; -} - /* static */ wxString wxCrashReportImpl::GetExceptionString(DWORD dwCode) { @@ -1018,6 +995,69 @@ wxString wxCrashReportImpl::GetExceptionString(DWORD dwCode) return s; } +#endif // wxUSE_DBGHELP + +bool wxCrashReportImpl::Generate(int flags) +{ + if ( m_hFile == INVALID_HANDLE_VALUE ) + return false; + +#if wxUSE_DBGHELP + if ( !wxGlobalSEInformation ) + return false; + + PEXCEPTION_RECORD pExceptionRecord = wxGlobalSEInformation->ExceptionRecord; + PCONTEXT pCtx = wxGlobalSEInformation->ContextRecord; + + if ( !pExceptionRecord || !pCtx ) + return false; + + HANDLE hModuleCrash = OutputBasicContext(pExceptionRecord, pCtx); + + // for everything else we need dbghelp.dll + wxDynamicLibrary dllDbgHelp(_T("dbghelp.dll"), wxDL_VERBATIM); + if ( dllDbgHelp.IsLoaded() ) + { + if ( ResolveSymFunctions(dllDbgHelp) ) + { + SymSetOptions(SYMOPT_DEFERRED_LOADS | SYMOPT_UNDNAME); + + // Initialize DbgHelp + if ( SymInitialize(GetCurrentProcess(), NULL, TRUE /* invade */) ) + { + OutputStack(pCtx, flags); + + if ( hModuleCrash && (flags & wxCRASH_REPORT_GLOBALS) ) + { + OutputGlobals(hModuleCrash); + } + + return true; + } + } + else + { + Output(_T("Please update your dbghelp.dll version, " + "at least version 5.1 is needed!\r\n")); + } + } + else + { + Output(_T("Please install dbghelp.dll available free of charge ") + _T("from Microsoft to get more detailed crash information!")); + } + + Output(_T("\r\nLatest dbghelp.dll is available at " + "http://www.microsoft.com/whdc/ddk/debugging/\r\n")); + +#else // !wxUSE_DBGHELP + Output(_T("Support for crash report generation was not included ") + _T("in this wxWindows version.")); +#endif // wxUSE_DBGHELP/!wxUSE_DBGHELP + + return true; +} + // ---------------------------------------------------------------------------- // wxCrashReport // ---------------------------------------------------------------------------- @@ -1078,7 +1118,7 @@ bool wxHandleFatalExceptions(bool doit) ); wxStrncat(gs_reportFilename, fname, - WXSIZEOF(gs_reportFilename) - strlen(gs_reportFilename) - 1); + WXSIZEOF(gs_reportFilename) - wxStrlen(gs_reportFilename) - 1); } return true; @@ -1092,7 +1132,16 @@ extern unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs) wxGlobalSEInformation = pExcPtrs; // give the user a chance to do something special about this - wxTheApp->OnFatalException(); + __try + { + wxTheApp->OnFatalException(); + } + __except ( EXCEPTION_EXECUTE_HANDLER ) + { + // nothing to do here, just ignore the exception inside the + // exception handler + ; + } wxGlobalSEInformation = NULL;