bool wxAppTraitsBase::ShowAssertDialog(const wxString& msgOriginal) { #if wxDEBUG_LEVEL wxString msg; #if wxUSE_STACKWALKER const wxString stackTrace = GetAssertStackTrace(); if ( !stackTrace.empty() ) { msg << wxT("\n\nCall stack:\n") << stackTrace; wxMessageOutputDebug().Output(msg); } #endif // wxUSE_STACKWALKER return DoShowAssertDialog(msgOriginal + msg); #else // !wxDEBUG_LEVEL wxUnusedVar(msgOriginal); return false; #endif // wxDEBUG_LEVEL/!wxDEBUG_LEVEL }
// show the assert modal dialog static void ShowAssertDialog(const wxChar *szFile, int nLine, const wxChar *szCond, const wxChar *szMsg, wxAppTraits *traits) { // this variable can be set to true to suppress "assert failure" messages static bool s_bNoAsserts = false; wxString msg; msg.reserve(2048); // make life easier for people using VC++ IDE by using this format: like // this, clicking on the message will take us immediately to the place of // the failed assert msg.Printf(wxT("%s(%d): assert \"%s\" failed"), szFile, nLine, szCond); if ( szMsg ) { msg << _T(": ") << szMsg; } else // no message given { msg << _T('.'); } #if wxUSE_STACKWALKER const wxString stackTrace = GetAssertStackTrace(); if ( !stackTrace.empty() ) { msg << _T("\n\nCall stack:\n") << stackTrace; } #endif // wxUSE_STACKWALKER #if wxUSE_THREADS // if we are not in the main thread, output the assert directly and trap // since dialogs cannot be displayed if ( !wxThread::IsMain() ) { msg += wxT(" [in child thread]"); #if defined(__WXMSW__) && !defined(__WXMICROWIN__) msg << wxT("\r\n"); OutputDebugString(msg ); #else // send to stderr wxFprintf(stderr, wxT("%s\n"), msg.c_str()); fflush(stderr); #endif // He-e-e-e-elp!! we're asserting in a child thread wxTrap(); } else #endif // wxUSE_THREADS if ( !s_bNoAsserts ) { // send it to the normal log destination wxLogDebug(_T("%s"), msg.c_str()); if ( traits ) { // delegate showing assert dialog (if possible) to that class s_bNoAsserts = traits->ShowAssertDialog(msg); } else // no traits object { // fall back to the function of last resort s_bNoAsserts = DoShowAssertDialog(msg); } } }
bool wxAppTraitsBase::ShowAssertDialog(const wxString& msg) { return DoShowAssertDialog(msg); }