X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a82c22998b76c7109366e8aea5e1fc90154ce749..509675f86bfa8fce701a7a93c650c616688dd3b3:/src/msw/stackwalk.cpp?ds=sidebyside diff --git a/src/msw/stackwalk.cpp b/src/msw/stackwalk.cpp index ed94c55efc..1b96e364d2 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; @@ -161,7 +161,7 @@ void wxStackFrame::OnParam(PSYMBOL_INFO pSymInfo) BOOL CALLBACK EnumSymbolsProc(PSYMBOL_INFO pSymInfo, ULONG WXUNUSED(SymSize), PVOID data) { - wxStackFrame *frame = wx_static_cast(wxStackFrame *, data); + wxStackFrame *frame = static_cast(data); // we're only interested in parameters if ( pSymInfo->Flags & IMAGEHLP_SYMBOL_INFO_PARAMETER ) @@ -214,7 +214,7 @@ 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() ) { @@ -267,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 @@ -293,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); @@ -310,12 +310,14 @@ 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() +#if wxUSE_ON_FATAL_EXCEPTION + +void wxStackWalker::WalkFromException(size_t maxDepth) { extern EXCEPTION_POINTERS *wxGlobalSEInformation; @@ -323,16 +325,18 @@ 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); } +#endif // wxUSE_ON_FATAL_EXCEPTION + 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 // // note: - // 1. we additionally skip RaiseException() and WalkFromException() frames + // 1. we additionally skip RaiseException() and WalkFrom() frames // 2. explicit cast to EXCEPTION_POINTERS is needed with VC7.1 even if it // shouldn't have been according to the docs __try @@ -342,7 +346,8 @@ void wxStackWalker::Walk(size_t skip, size_t WXUNUSED(maxDepth)) __except( WalkFrom((EXCEPTION_POINTERS *)GetExceptionInformation(), skip + 2), EXCEPTION_CONTINUE_EXECUTION ) { - // never executed because of WalkFromException() return value + // never executed because the above expression always evaluates to + // EXCEPTION_CONTINUE_EXECUTION } } @@ -386,21 +391,26 @@ 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() +#if wxUSE_ON_FATAL_EXCEPTION +void wxStackWalker::WalkFromException(size_t WXUNUSED(maxDepth)) { } +#endif // wxUSE_ON_FATAL_EXCEPTION -void wxStackWalker::Walk(size_t WXUNUSED(skip)) +void wxStackWalker::Walk(size_t WXUNUSED(skip), size_t WXUNUSED(maxDepth)) { }