X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1b072e196e182a08c2dad1df0498d108537681a7..96b2cbe8b39292fed91654ff0d1f4b1c16561acb:/src/msw/stackwalk.cpp diff --git a/src/msw/stackwalk.cpp b/src/msw/stackwalk.cpp index f67b384083..212c2eda69 100644 --- a/src/msw/stackwalk.cpp +++ b/src/msw/stackwalk.cpp @@ -56,7 +56,7 @@ void wxStackFrame::OnGetName() wxZeroMemory(symbolBuffer); PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)symbolBuffer; - pSymbol->SizeOfStruct = sizeof(symbolBuffer); + pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO); pSymbol->MaxNameLen = MAX_NAME_LEN; DWORD64 symDisplacement = 0; @@ -128,15 +128,15 @@ wxStackFrame::GetParam(size_t n, void wxStackFrame::OnParam(PSYMBOL_INFO pSymInfo) { - m_paramTypes.Add(_T("")); + m_paramTypes.Add(wxEmptyString); m_paramNames.Add(wxString::FromAscii(pSymInfo->Name)); // if symbol information is corrupted and we crash, the exception is going // to be ignored when we're called from WalkFromException() because of the - // except handler there returning EXCEPTION_CONTINUE_EXECUTION, but we'd be - // left in an inconsistent state, so deal with it explicitely here (even if - // normally we should never crash, of course...) + // exception handler there returning EXCEPTION_CONTINUE_EXECUTION, but we'd + // be left in an inconsistent state, so deal with it explicitly here (even + // if normally we should never crash, of course...) #ifdef _CPPUNWIND try #else @@ -154,7 +154,7 @@ void wxStackFrame::OnParam(PSYMBOL_INFO pSymInfo) __except ( EXCEPTION_EXECUTE_HANDLER ) #endif { - m_paramValues.Add(_T("")); + m_paramValues.Add(wxEmptyString); } } @@ -214,12 +214,16 @@ void wxStackFrame::OnGetParam() // wxStackWalker // ---------------------------------------------------------------------------- -void wxStackWalker::WalkFrom(const CONTEXT *pCtx, size_t skip) +void wxStackWalker::WalkFrom(const CONTEXT *pCtx, size_t skip, size_t maxDepth) { if ( !wxDbgHelpDLL::Init() ) { - wxLogError(_("Failed to get stack backtrace:\n%s"), + // don't log a user-visible error message here because the stack trace + // is only needed for debugging/diagnostics anyhow and we shouldn't + // confuse the user by complaining that we couldn't generate it + wxLogDebug(_T("Failed to get stack backtrace: %s"), wxDbgHelpDLL::GetErrorMessage().c_str()); + return; } // according to MSDN, the first parameter should be just a unique value and @@ -263,7 +267,7 @@ void wxStackWalker::WalkFrom(const CONTEXT *pCtx, size_t skip) #endif // _M_IX86 // iterate over all stack frames - for ( size_t nLevel = 0; ; nLevel++ ) + for ( size_t nLevel = 0; nLevel < maxDepth; nLevel++ ) { // get the next stack frame if ( !wxDbgHelpDLL::StackWalk @@ -289,7 +293,7 @@ void wxStackWalker::WalkFrom(const CONTEXT *pCtx, size_t skip) if ( nLevel >= skip ) { wxStackFrame frame(nLevel - skip, - (void *)sf.AddrPC.Offset, + wxUIntToPtr(sf.AddrPC.Offset), sf.AddrFrame.Offset); OnStackFrame(frame); @@ -306,12 +310,12 @@ void wxStackWalker::WalkFrom(const CONTEXT *pCtx, size_t skip) #endif } -void wxStackWalker::WalkFrom(const _EXCEPTION_POINTERS *ep, size_t skip) +void wxStackWalker::WalkFrom(const _EXCEPTION_POINTERS *ep, size_t skip, size_t maxDepth) { - WalkFrom(ep->ContextRecord, skip); + WalkFrom(ep->ContextRecord, skip, maxDepth); } -void wxStackWalker::WalkFromException() +void wxStackWalker::WalkFromException(size_t maxDepth) { extern EXCEPTION_POINTERS *wxGlobalSEInformation; @@ -319,10 +323,10 @@ void wxStackWalker::WalkFromException() _T("wxStackWalker::WalkFromException() can only be called from wxApp::OnFatalException()") ); // don't skip any frames, the first one is where we crashed - WalkFrom(wxGlobalSEInformation, 0); + WalkFrom(wxGlobalSEInformation, 0, maxDepth); } -void wxStackWalker::Walk(size_t skip) +void wxStackWalker::Walk(size_t skip, size_t WXUNUSED(maxDepth)) { // to get a CONTEXT for the current location, simply force an exception and // get EXCEPTION_POINTERS from it @@ -382,21 +386,24 @@ void wxStackFrame::OnGetParam() // ---------------------------------------------------------------------------- void -wxStackWalker::WalkFrom(const CONTEXT * WXUNUSED(pCtx), size_t WXUNUSED(skip)) +wxStackWalker::WalkFrom(const CONTEXT * WXUNUSED(pCtx), + size_t WXUNUSED(skip), + size_t WXUNUSED(maxDepth)) { } void wxStackWalker::WalkFrom(const _EXCEPTION_POINTERS * WXUNUSED(ep), - size_t WXUNUSED(skip)) + size_t WXUNUSED(skip), + size_t WXUNUSED(maxDepth)) { } -void wxStackWalker::WalkFromException() +void wxStackWalker::WalkFromException(size_t WXUNUSED(maxDepth)) { } -void wxStackWalker::Walk(size_t WXUNUSED(skip)) +void wxStackWalker::Walk(size_t WXUNUSED(skip), size_t WXUNUSED(maxDepth)) { }