diff --git a/ApplicationLibCode/Application/RiaGuiApplication.cpp b/ApplicationLibCode/Application/RiaGuiApplication.cpp index 367e727357..9da72ad9c0 100644 --- a/ApplicationLibCode/Application/RiaGuiApplication.cpp +++ b/ApplicationLibCode/Application/RiaGuiApplication.cpp @@ -1881,6 +1881,13 @@ bool RiaGuiApplication::notify( QObject* receiver, QEvent* event ) return QApplication::notify( receiver, event ); } + // The crash handler pumps the event loop to send the crash report. Repainting a widget there can re-enter the + // faulting code and crash again, replacing the original report with one blaming the crash handler. + if ( RiaOpenTelemetryManager::instance().isReportingCrash() && ( receiver->isWidgetType() || receiver->isWindowType() ) ) + { + return false; + } + bool done = false; try { diff --git a/ApplicationLibCode/Application/Tools/Telemetry/RiaOpenTelemetryManager.cpp b/ApplicationLibCode/Application/Tools/Telemetry/RiaOpenTelemetryManager.cpp index ec76be501a..6c77bd953b 100644 --- a/ApplicationLibCode/Application/Tools/Telemetry/RiaOpenTelemetryManager.cpp +++ b/ApplicationLibCode/Application/Tools/Telemetry/RiaOpenTelemetryManager.cpp @@ -418,6 +418,8 @@ void RiaOpenTelemetryManager::reportCrash( int signalCode, const std::stacktrace // still flow, so the HTTP reply completes. if ( m_pendingReplies.load() > 0 ) { + m_isReportingCrash = true; + auto* prefs = RiaPreferencesOpenTelemetry::current(); int timeoutMs = prefs ? prefs->connectionTimeoutMs() : 5000; int elapsedMs = 0; @@ -451,6 +453,14 @@ bool RiaOpenTelemetryManager::isInitialized() const return m_initialized.load(); } +//-------------------------------------------------------------------------------------------------- +/// True while the crash handler sends a crash report. Never reset, the process exits afterwards. +//-------------------------------------------------------------------------------------------------- +bool RiaOpenTelemetryManager::isReportingCrash() const +{ + return m_isReportingCrash.load(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/Telemetry/RiaOpenTelemetryManager.h b/ApplicationLibCode/Application/Tools/Telemetry/RiaOpenTelemetryManager.h index 553fb09b1b..f7ab75a7c8 100644 --- a/ApplicationLibCode/Application/Tools/Telemetry/RiaOpenTelemetryManager.h +++ b/ApplicationLibCode/Application/Tools/Telemetry/RiaOpenTelemetryManager.h @@ -111,6 +111,7 @@ public: // Configuration bool isEnabled() const; bool isInitialized() const; + bool isReportingCrash() const; void setErrorCallback( ErrorCallback callback ); void setUsername( const std::string& username ); @@ -180,6 +181,7 @@ private: std::atomic m_enabled{ false }; std::atomic m_isShuttingDown{ false }; std::atomic m_circuitBreakerOpen{ false }; + std::atomic m_isReportingCrash{ false }; // Qt networking and timer QNetworkAccessManager* m_networkAccessManager{ nullptr };