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