From 2cfac3a8968c66cced8cbe0a8295a5bc2f0266a2 Mon Sep 17 00:00:00 2001
From: Dale Glass <dale@daleglass.net>
Date: Mon, 26 Jun 2023 01:02:22 +0200
Subject: [PATCH] Make crash reporting work on domain-server

---
 domain-server/CMakeLists.txt       |  5 ++++-
 domain-server/src/DomainServer.cpp |  8 ++++++++
 domain-server/src/DomainServer.h   |  4 ++++
 domain-server/src/main.cpp         | 14 ++++++++++++++
 interface/src/main.cpp             |  2 ++
 5 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/domain-server/CMakeLists.txt b/domain-server/CMakeLists.txt
index 49c9045cfd..2327762610 100644
--- a/domain-server/CMakeLists.txt
+++ b/domain-server/CMakeLists.txt
@@ -30,12 +30,15 @@ symlink_or_copy_directory_beside_target(${_SHOULD_SYMLINK_RESOURCES} "${CMAKE_CU
 include_hifi_library_headers(gpu)
 include_hifi_library_headers(graphics)
 include_hifi_library_headers(script-engine)
-link_hifi_libraries(embedded-webserver networking shared avatars octree)
+link_hifi_libraries(embedded-webserver networking shared avatars octree monitoring)
 
 target_zlib()
 target_quazip()
 target_openssl()
 
+add_crashpad()
+target_breakpad()
+
 # libcrypto uses dlopen in libdl
 if (UNIX)
   target_link_libraries(${TARGET_NAME} ${CMAKE_DL_LIBS})
diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp
index 62d6572ae3..4164133058 100644
--- a/domain-server/src/DomainServer.cpp
+++ b/domain-server/src/DomainServer.cpp
@@ -85,6 +85,8 @@ QUuid DomainServer::_overridingDomainID;
 bool DomainServer::_getTempName { false };
 QString DomainServer::_userConfigFilename;
 int DomainServer::_parentPID { -1 };
+bool DomainServer::_forceCrashReporting{false};
+
 
 /// @brief The Domain server can proxy requests to the Directory Server, this function handles those forwarding requests.
 /// @param connection The HTTP connection object.
@@ -417,6 +419,8 @@ void DomainServer::parseCommandLine(int argc, char* argv[]) {
     const QCommandLineOption logOption("logOptions", "Logging options, comma separated: color,nocolor,process_id,thread_id,milliseconds,keep_repeats,journald,nojournald", "options");
     parser.addOption(logOption);
 
+    const QCommandLineOption forceCrashReportingOption("forceCrashReporting", "Force crash reporting to initialize.");
+    parser.addOption(forceCrashReportingOption);
 
     QStringList arguments;
     for (int i = 0; i < argc; ++i) {
@@ -488,6 +492,10 @@ void DomainServer::parseCommandLine(int argc, char* argv[]) {
             qDebug() << "Parent process PID is" << _parentPID;
         }
     }
+
+    if (parser.isSet(forceCrashReportingOption)) {
+        _forceCrashReporting = true;
+    }
 }
 
 DomainServer::~DomainServer() {
diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h
index 38cc63b1da..a22671916b 100644
--- a/domain-server/src/DomainServer.h
+++ b/domain-server/src/DomainServer.h
@@ -83,6 +83,8 @@ public:
 
     void screensharePresence(QString roomname, QUuid avatarID, int expiration_seconds = 0);
 
+    static bool forceCrashReporting() { return _forceCrashReporting; }
+
 public slots:
     /// Called by NodeList to inform us a node has been added
     void nodeAdded(SharedNodePointer node);
@@ -311,6 +313,8 @@ private:
     static bool _getTempName;
     static QString _userConfigFilename;
     static int _parentPID;
+    static bool _forceCrashReporting;
+
 
     bool _sendICEServerAddressToMetaverseAPIInProgress { false };
     bool _sendICEServerAddressToMetaverseAPIRedo { false };
diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp
index ba12349347..640643d9b3 100644
--- a/domain-server/src/main.cpp
+++ b/domain-server/src/main.cpp
@@ -21,6 +21,8 @@
 #include <SharedUtil.h>
 
 #include "DomainServer.h"
+#include <crash-handler/CrashHandler.h>
+
 
 int main(int argc, char* argv[]) {
     setupHifiApplication(BuildInfo::DOMAIN_SERVER_NAME);
@@ -32,9 +34,21 @@ int main(int argc, char* argv[]) {
     int currentExitCode = 0;
 
     // use a do-while to handle domain-server restart
+    auto &ch = CrashHandler::getInstance();
+    ch.start(argv[0]);
+
+    if ( DomainServer::forceCrashReporting() ) {
+        ch.setEnabled(true);
+    }
+
+    ch.setAnnotation("program", "domain-server");
+
+
     do {
         crash::annotations::setShutdownState(false);
         DomainServer domainServer(argc, argv);
+        ch.startMonitor(&domainServer);
+
         currentExitCode = domainServer.exec();
     } while (currentExitCode == DomainServer::EXIT_CODE_REBOOT);
 
diff --git a/interface/src/main.cpp b/interface/src/main.cpp
index 6baa338f92..3931fb97cf 100644
--- a/interface/src/main.cpp
+++ b/interface/src/main.cpp
@@ -344,6 +344,8 @@ int main(int argc, const char* argv[]) {
         qWarning() << "Crash handler failed to start";
     }
 
+    ch.setAnnotation("program", "interface");
+
     const QString& applicationName = getInterfaceSharedMemoryName();
     bool instanceMightBeRunning = true;
 #ifdef Q_OS_WIN