From: Vadim Zeitlin Date: Tue, 25 Sep 2012 10:49:45 +0000 (+0000) Subject: Really fix stack dumps for asserts and wxStackWalker::Walk() calls. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/1114902acfc811899037b4748deb0569a7230606 Really fix stack dumps for asserts and wxStackWalker::Walk() calls. The code apparently tried to compensate for the wrong "skip" values used in the calls to wxStackWalker::Walk() by skipping too much in Walk() itself which was wrong as it dropped the frames that should have been shown. Fix this by skipping only the one extra (compared to Walk() itself) frame we add in wxStackWalker Unix implementation and not 3 of them and do skip more frames when calling Walk() from assert failure handlers. Also fix the wrong number of frames used in ProcessFrames(): we must not subtract the number of skipped frames, they were already skipped. Closes #14690. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72546 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/common/appbase.cpp b/src/common/appbase.cpp index 3671f0ee0e..57e0912e2e 100644 --- a/src/common/appbase.cpp +++ b/src/common/appbase.cpp @@ -953,7 +953,7 @@ wxString wxAppTraitsBase::GetAssertStackTrace() static const int maxLines = 20; StackDump dump; - dump.Walk(2, maxLines); // don't show OnAssert() call itself + dump.Walk(8, maxLines); // 8 is chosen to hide all OnAssert() calls stackTrace = dump.GetStackTrace(); const int count = stackTrace.Freq(wxT('\n')); diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index c075851073..5ba11b4e02 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -335,7 +335,7 @@ static void get_stackframe_callback(void* p) { StackDump* dump = static_cast(p); // skip over frames up to including wxOnAssert() - dump->ProcessFrames(3); + dump->ProcessFrames(7); } #endif // wxDEBUG_LEVEL && wxUSE_STACKWALKER diff --git a/src/unix/stackwalk.cpp b/src/unix/stackwalk.cpp index 28c4fa89c3..d082dfd22f 100644 --- a/src/unix/stackwalk.cpp +++ b/src/unix/stackwalk.cpp @@ -182,17 +182,18 @@ void wxStackWalker::ProcessFrames(size_t skip) if (!ms_symbols || !m_depth) return; - // we have 3 more "intermediate" frames which the calling code doesn't know - // about, account for them + // we are another level down from Walk(), so adjust the number of stack + // frames to skip accordingly skip += 1; // call addr2line only once since this call may be very slow // (it has to load in memory the entire EXE of this app which may be quite // big, especially if it contains debug info and is compiled statically!) - int towalk = InitFrames(frames, m_depth - skip, &ms_addresses[skip], &ms_symbols[skip]); + int numFrames = InitFrames(frames, m_depth - skip, + &ms_addresses[skip], &ms_symbols[skip]); // now do user-defined operations on each frame - for ( int n = 0; n < towalk - (int)skip; n++ ) + for ( int n = 0; n < numFrames; n++ ) OnStackFrame(frames[n]); }