diff --git a/src/blackcore/application.cpp b/src/blackcore/application.cpp index e5e5aa69f..2c3ba9c8c 100644 --- a/src/blackcore/application.cpp +++ b/src/blackcore/application.cpp @@ -1649,6 +1649,11 @@ namespace BlackCore CCrashHandler::instance()->simulateCrash(); } + void CApplication::simulateAssert() + { + CCrashHandler::instance()->simulateAssert(); + } + void CApplication::enableCrashDumpUpload(bool enable) { CCrashHandler::instance()->setUploadsEnabled(enable); diff --git a/src/blackcore/application.h b/src/blackcore/application.h index 972e53432..96c6827c3 100644 --- a/src/blackcore/application.h +++ b/src/blackcore/application.h @@ -309,6 +309,10 @@ namespace BlackCore //! \private only for testing purposes void simulateCrash(); + //! Simulate an ASSERT + //! \private only for testing purposes + void simulateAssert(); + //! Enable crash upload //! \remark only change for testing void enableCrashDumpUpload(bool enable); diff --git a/src/blackgui/components/internalscomponent.cpp b/src/blackgui/components/internalscomponent.cpp index 3e30cce6b..c13ce49ed 100644 --- a/src/blackgui/components/internalscomponent.cpp +++ b/src/blackgui/components/internalscomponent.cpp @@ -99,8 +99,9 @@ namespace BlackGui if (sGui && sGui->isSupportingCrashpad()) { ui->cb_CrashDumpUpload->setChecked(CCrashHandler::instance()->isCrashDumpUploadEnabled()); - connect(ui->pb_SimulateCrash, &QPushButton::released, this, &CInternalsComponent::simulateCrash); - connect(ui->cb_CrashDumpUpload, &QCheckBox::toggled, this, &CInternalsComponent::onCrashDumpUploadToggled); + connect(ui->pb_SimulateCrash, &QPushButton::released, this, &CInternalsComponent::simulateCrash, Qt::QueuedConnection); + connect(ui->pb_SimulateAssert, &QPushButton::released, this, &CInternalsComponent::simulateAssert, Qt::QueuedConnection); + connect(ui->cb_CrashDumpUpload, &QCheckBox::toggled, this, &CInternalsComponent::onCrashDumpUploadToggled); } else { @@ -345,10 +346,23 @@ namespace BlackGui } const QMessageBox::StandardButton reply = QMessageBox::question(this, "crash simulation", "Really simulate crash?", QMessageBox::Yes | QMessageBox::No); - if (reply != QMessageBox::Yes) { return; } + if (!sGui || reply != QMessageBox::Yes) { return; } sGui->simulateCrash(); } + void CInternalsComponent::simulateAssert() + { + if (CBuildConfig::isReleaseBuild()) + { + QMessageBox::information(this, "ASSERT simulation", "Not possible in release builds!"); + return; + } + + const QMessageBox::StandardButton reply = QMessageBox::question(this, "ASSERT simulation", "Really create an ASSERT?", QMessageBox::Yes | QMessageBox::No); + if (!sGui || reply != QMessageBox::Yes) { return; } + sGui->simulateAssert(); + } + void CInternalsComponent::onCrashDumpUploadToggled(bool checked) { if (sGui && sGui->isSupportingCrashpad()) diff --git a/src/blackgui/components/internalscomponent.h b/src/blackgui/components/internalscomponent.h index 4c1f4867a..7c0a63f6e 100644 --- a/src/blackgui/components/internalscomponent.h +++ b/src/blackgui/components/internalscomponent.h @@ -78,6 +78,9 @@ namespace BlackGui //! Simulate a crash void simulateCrash(); + //! Simulate ASSERT + void simulateAssert(); + //! Checkbox toggled void onCrashDumpUploadToggled(bool checked); diff --git a/src/blackgui/components/internalscomponent.ui b/src/blackgui/components/internalscomponent.ui index 56c484c53..0c0ca66f9 100644 --- a/src/blackgui/components/internalscomponent.ui +++ b/src/blackgui/components/internalscomponent.ui @@ -320,6 +320,13 @@ + + + + assert! + + + @@ -751,6 +758,7 @@ cb_DebugContextApplication cb_CrashDumpUpload pb_SimulateCrash + pb_SimulateAssert pb_LatestInterpolationLog pb_LatestPartsLog pte_NetworkCalls @@ -760,10 +768,10 @@ pb_DisplayLog pb_RequestFromNetwork tb_History - pb_SendAircraftPartsGui pb_CurrentParts cb_AircraftPartsIncremental pb_SendAircraftPartsJson + pb_SendAircraftPartsGui diff --git a/src/blackmisc/crashhandler.cpp b/src/blackmisc/crashhandler.cpp index 270c5ae94..9076a832d 100644 --- a/src/blackmisc/crashhandler.cpp +++ b/src/blackmisc/crashhandler.cpp @@ -107,29 +107,29 @@ namespace BlackMisc false, true); this->crashAndLogAppendInfo(u"Init crash info at " % QDateTime::currentDateTimeUtc().toString()); - #endif +#endif } void CCrashHandler::setUploadsEnabled(bool enable) { - #ifdef BLACK_USE_CRASHPAD +#ifdef BLACK_USE_CRASHPAD if (!m_crashReportDatabase) { return; } crashpad::Settings *settings = m_crashReportDatabase->GetSettings(); settings->SetUploadsEnabled(enable); - #else +#else Q_UNUSED(enable); - #endif +#endif } bool CCrashHandler::isCrashDumpUploadEnabled() const { - #ifdef BLACK_USE_CRASHPAD +#ifdef BLACK_USE_CRASHPAD if (!m_crashReportDatabase) { return false; } crashpad::Settings *settings = m_crashReportDatabase->GetSettings(); bool enabled = false; bool ok = settings->GetUploadsEnabled(&enabled); return ok && enabled; - #else +#else return false; #endif } @@ -171,16 +171,28 @@ namespace BlackMisc void CCrashHandler::simulateCrash() { - #ifdef BLACK_USE_CRASHPAD +# ifdef BLACK_USE_CRASHPAD CLogMessage(this).info(u"Simulated crash dump!"); m_crashAndLogInfo.appendInfo("Simulated crash dump!"); m_crashAndLogInfo.writeToFile(); CRASHPAD_SIMULATE_CRASH(); // real crash // raise(SIGSEGV); #include - #else +# else CLogMessage(this).warning(u"This compiler or platform does not support crashpad. Cannot simulate crash dump!"); -#endif +# endif + } + + void CCrashHandler::simulateAssert() + { +# ifdef BLACK_USE_CRASHPAD + CLogMessage(this).info(u"Simulated ASSERT!"); + m_crashAndLogInfo.appendInfo("Simulated ASSERT!"); + m_crashAndLogInfo.writeToFile(); + Q_ASSERT_X(false, Q_FUNC_INFO, "Test server to test Crash handler"); +# else + CLogMessage(this).warning(u"This compiler or platform does not support crashpad. Cannot simulate crash dump!"); +# endif } CCrashHandler::CCrashHandler(QObject *parent) : diff --git a/src/blackmisc/crashhandler.h b/src/blackmisc/crashhandler.h index b65f97cc4..39ab48b1f 100644 --- a/src/blackmisc/crashhandler.h +++ b/src/blackmisc/crashhandler.h @@ -73,6 +73,9 @@ namespace BlackMisc //! Simulate a crash void simulateCrash(); + //! Simulate an ASSERT + void simulateAssert(); + private: CCrashHandler(QObject *parent = nullptr);