Show assert stack if in the test if possible

Make wxAppTraitsBase::GetAssertStackTrace() and reuse it in the assert
handler defined in the test to show more information about the asserts,
especially those failing in worker threads, if possible.
This commit is contained in:
Vadim Zeitlin
2021-04-07 14:37:16 +02:00
parent fb136cf154
commit 9437a6abf0
3 changed files with 24 additions and 4 deletions

View File

@@ -164,11 +164,13 @@ public:
} }
protected:
#if wxUSE_STACKWALKER #if wxUSE_STACKWALKER
// utility function: returns the stack frame as a plain wxString // Helper function mostly useful for derived classes ShowAssertDialog()
// implementation.
//
// Returns the stack frame as a plain (and possibly empty) wxString.
virtual wxString GetAssertStackTrace(); virtual wxString GetAssertStackTrace();
#endif #endif // wxUSE_STACKWALKER
private: private:
static wxSocketManager *ms_manager; static wxSocketManager *ms_manager;

View File

@@ -156,5 +156,17 @@ public:
@return @true if the message box was shown or @false otherwise. @return @true if the message box was shown or @false otherwise.
*/ */
virtual bool SafeMessageBox(const wxString& text, const wxString& title) = 0; virtual bool SafeMessageBox(const wxString& text, const wxString& title) = 0;
/**
Helper function mostly useful for derived classes ShowAssertDialog()
implementation.
Returns the stack frame as a plain (and possibly empty) wxString.
This function is only available when @c wxUSE_STACKWALKER is 1.
@since 3.1.5
*/
virtual wxString GetAssertStackTrace();
}; };

View File

@@ -131,7 +131,7 @@ static void TestAssertHandler(const wxString& file,
{ {
// Exceptions thrown from worker threads are not caught currently and // Exceptions thrown from worker threads are not caught currently and
// so we'd just die without any useful information -- abort instead. // so we'd just die without any useful information -- abort instead.
abortReason << assertMessage << wxASCII_STR("in a worker thread."); abortReason << assertMessage << wxASCII_STR(" in a worker thread.");
} }
#if __cplusplus >= 201703L || wxCHECK_VISUALC_VERSION(14) #if __cplusplus >= 201703L || wxCHECK_VISUALC_VERSION(14)
else if ( uncaught_exceptions() ) else if ( uncaught_exceptions() )
@@ -164,6 +164,12 @@ static void TestAssertHandler(const wxString& file,
throw TestAssertFailure(file, line, func, cond, msg); throw TestAssertFailure(file, line, func, cond, msg);
} }
#if wxUSE_STACKWALKER
const wxString& stackTrace = wxApp::GetValidTraits().GetAssertStackTrace();
if ( !stackTrace.empty() )
abortReason << wxASCII_STR("\n\nAssert call stack:\n") << stackTrace;
#endif // wxUSE_STACKWALKER
wxFputs(abortReason, stderr); wxFputs(abortReason, stderr);
fflush(stderr); fflush(stderr);
_exit(-1); _exit(-1);