From 64be0a547c37e700235fdf4eb313c515ecfeb937 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 23 Apr 2018 12:58:33 -0700 Subject: [PATCH 1/2] hook up several annotations for crash reporter --- interface/src/Application.cpp | 17 +++++++++++++++++ interface/src/Crashpad.cpp | 23 ++++++++++++++--------- interface/src/DiscoverabilityManager.cpp | 7 +++++-- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6d4c82d4bf..337a793e9c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1060,6 +1060,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo if (steamClient) { qCDebug(interfaceapp) << "[VERSION] SteamVR buildID:" << steamClient->getSteamVRBuildID(); } + setCrashAnnotation("steam", property(hifi::properties::STEAM).toBool() ? "1" : "0"); + qCDebug(interfaceapp) << "[VERSION] Build sequence:" << qPrintable(applicationVersion()); qCDebug(interfaceapp) << "[VERSION] MODIFIED_ORGANIZATION:" << BuildInfo::MODIFIED_ORGANIZATION; qCDebug(interfaceapp) << "[VERSION] VERSION:" << BuildInfo::VERSION; @@ -1145,6 +1147,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo const DomainHandler& domainHandler = nodeList->getDomainHandler(); connect(&domainHandler, SIGNAL(domainURLChanged(QUrl)), SLOT(domainURLChanged(QUrl))); + connect(&domainHandler, &DomainHandler::domainURLChanged, [](QUrl domainURL){ + setCrashAnnotation("domain", domainURL.toString().toStdString()); + }); connect(&domainHandler, SIGNAL(resetting()), SLOT(resettingDomain())); connect(&domainHandler, SIGNAL(connectedToDomain(QUrl)), SLOT(updateWindowTitle())); connect(&domainHandler, SIGNAL(disconnectedFromDomain()), SLOT(updateWindowTitle())); @@ -1190,6 +1195,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo auto dialogsManager = DependencyManager::get(); connect(accountManager.data(), &AccountManager::authRequired, dialogsManager.data(), &DialogsManager::showLoginDialog); connect(accountManager.data(), &AccountManager::usernameChanged, this, &Application::updateWindowTitle); + connect(accountManager.data(), &AccountManager::usernameChanged, [](QString username){ + setCrashAnnotation("username", username.toStdString()); + }); // set the account manager's root URL and trigger a login request if we don't have the access token accountManager->setIsAgent(true); @@ -1207,6 +1215,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo connect(this, &Application::activeDisplayPluginChanged, this, &Application::updateThreadPoolCount); connect(this, &Application::activeDisplayPluginChanged, this, [](){ qApp->setProperty(hifi::properties::HMD, qApp->isHMDMode()); + auto displayPlugin = qApp->getActiveDisplayPlugin(); + setCrashAnnotation("display_plugin", displayPlugin->getName().toStdString()); + setCrashAnnotation("hmd", displayPlugin->isHmd() ? "1" : "0"); }); connect(this, &Application::activeDisplayPluginChanged, this, &Application::updateSystemTabletMode); @@ -1214,6 +1225,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo connect(myAvatar.get(), &MyAvatar::positionGoneTo, DependencyManager::get().data(), &AddressManager::storeCurrentAddress); + connect(myAvatar.get(), &MyAvatar::skeletonModelURLChanged, [](){ + QUrl avatarURL = qApp->getMyAvatar()->getSkeletonModelURL(); + setCrashAnnotation("avatar", avatarURL.toString().toStdString()); + }); + + // Inititalize sample before registering _sampleSound = DependencyManager::get()->getSound(PathUtils::resourcesUrl("sounds/sample.wav")); diff --git a/interface/src/Crashpad.cpp b/interface/src/Crashpad.cpp index ae2f341337..e39cd42d81 100644 --- a/interface/src/Crashpad.cpp +++ b/interface/src/Crashpad.cpp @@ -15,6 +15,8 @@ #if HAS_CRASHPAD +#include + #include #include @@ -23,8 +25,8 @@ #include #include #include -// #include -// #include +#include +#include using namespace crashpad; @@ -35,7 +37,8 @@ static std::wstring gIPCPipe; extern QString qAppFileName(); -// crashpad::AnnotationList* crashpadAnnotations { nullptr }; +std::mutex annotationMutex; +crashpad::SimpleStringDictionary* crashpadAnnotations { nullptr }; #include @@ -102,12 +105,14 @@ bool startCrashHandler() { } void setCrashAnnotation(std::string name, std::string value) { - // if (!crashpadAnnotations) { - // crashpadAnnotations = new crashpad::AnnotationList(); // don't free this, let it leak - // crashpad::CrashpadInfo* crashpad_info = crashpad::GetCrashpadInfo(); - // crashpad_info->set_simple_annotations(crashpadAnnotations); - // } - // crashpadAnnotations->SetKeyValue(name, value); + std::lock_guard guard(annotationMutex); + if (!crashpadAnnotations) { + crashpadAnnotations = new crashpad::SimpleStringDictionary(); // don't free this, let it leak + crashpad::CrashpadInfo* crashpad_info = crashpad::CrashpadInfo::GetCrashpadInfo(); + crashpad_info->set_simple_annotations(crashpadAnnotations); + } + std::replace(value.begin(), value.end(), ',', ';'); + crashpadAnnotations->SetKeyValue(name, value); } #else diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index 33cfc481d7..b3c059de7f 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -20,6 +20,7 @@ #include #include +#include "Crashpad.h" #include "DiscoverabilityManager.h" #include "Menu.h" @@ -127,10 +128,12 @@ void DiscoverabilityManager::updateLocation() { QNetworkAccessManager::PutOperation, callbackParameters); } - // Update Steam + // Update Steam and crash logger + QUrl currentAddress = addressManager->currentFacingPublicAddress(); if (auto steamClient = PluginManager::getInstance()->getSteamClientPlugin()) { - steamClient->updateLocation(domainHandler.getHostname(), addressManager->currentFacingPublicAddress()); + steamClient->updateLocation(domainHandler.getHostname(), currentAddress); } + setCrashAnnotation("address", currentAddress.toString().toStdString()); } void DiscoverabilityManager::handleHeartbeatResponse(QNetworkReply& requestReply) { From 5e790d489869fb4bdd24d3538a1b79fc3967e0e5 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 26 Apr 2018 09:49:20 -0700 Subject: [PATCH 2/2] include machine_fingerprint --- interface/src/Application.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 337a793e9c..1fd7d6dfc1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1394,6 +1394,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo userActivityLogger.disable(false); } + QString machineFingerPrint = uuidStringWithoutCurlyBraces(FingerprintUtils::getMachineFingerprint()); + if (userActivityLogger.isEnabled()) { // sessionRunTime will be reset soon by loadSettings. Grab it now to get previous session value. // The value will be 0 if the user blew away settings this session, which is both a feature and a bug. @@ -1441,11 +1443,13 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo properties["first_run"] = firstRun.get(); // add the user's machine ID to the launch event - properties["machine_fingerprint"] = uuidStringWithoutCurlyBraces(FingerprintUtils::getMachineFingerprint()); + properties["machine_fingerprint"] = machineFingerPrint; userActivityLogger.logAction("launch", properties); } + setCrashAnnotation("machine_fingerprint", machineFingerPrint.toStdString()); + _entityEditSender.setMyAvatar(myAvatar.get()); // The entity octree will have to know about MyAvatar for the parentJointName import