]> git.saurik.com Git - wxWidgets.git/commitdiff
Really fix stack dumps for asserts and wxStackWalker::Walk() calls.
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 25 Sep 2012 10:49:45 +0000 (10:49 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 25 Sep 2012 10:49:45 +0000 (10:49 +0000)
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

src/common/appbase.cpp
src/gtk/utilsgtk.cpp
src/unix/stackwalk.cpp

index 3671f0ee0e395a53a6b94e9336f75b4c1dec7899..57e0912e2e6d35b41f7332df8a720efe02363ef7 100644 (file)
@@ -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'));
index c075851073e9797fe3264483ecefa1941b7c296a..5ba11b4e02248064d89d5e489ca4efc1bfc52df0 100644 (file)
@@ -335,7 +335,7 @@ static void get_stackframe_callback(void* p)
 {
     StackDump* dump = static_cast<StackDump*>(p);
     // skip over frames up to including wxOnAssert()
-    dump->ProcessFrames(3);
+    dump->ProcessFrames(7);
 }
 
 #endif // wxDEBUG_LEVEL && wxUSE_STACKWALKER
index 28c4fa89c377c1e0db0c3b6f9f57b2c806ca830f..d082dfd22fd5b45d4de6c565cd638b2a3e199216 100644 (file)
@@ -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]);
 }