From 7f52f785174834ec00f7624adf36b0ee00e0b65a Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Tue, 15 Oct 2013 07:20:57 +0200 Subject: [PATCH] Breaking pad: restore 'Ask' preference for sending reports, cleanup remaining out-of-process bits --- indra/llcommon/llapp.cpp | 46 +++------------------ indra/newview/llappviewerwin32.cpp | 56 +------------------------- indra/newview/llcrashlogger.cpp | 64 +++++++++++++++++++++++++----- 3 files changed, 60 insertions(+), 106 deletions(-) diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 2026a9e4d..9be58c05b 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -307,46 +307,12 @@ void LLApp::setupErrorHandling() // Install the Google Breakpad crash handler for Windows if(mExceptionHandler == 0) { - llwarns << "adding breakpad exception handler" << llendl; - - std::wostringstream ws; - ws << mCrashReportPipeStr << getPid(); - std::wstring wpipe_name = ws.str(); - std::string ptmp = std::string(wpipe_name.begin(), wpipe_name.end()); - - ::Sleep(2000); //HACK hopefully a static wait won't blow up in my face before google fixes their implementation. - - //HACK this for loop is ueless. Breakpad dumbly returns success when the OOP handler isn't initialized. - for (int retries=0;retries<5;++retries) - { - mExceptionHandler = new google_breakpad::ExceptionHandler( - L"", - NULL, //No filter - windows_post_minidump_callback, - 0, - google_breakpad::ExceptionHandler::HANDLER_ALL, - MiniDumpNormal, //Generate a 'normal' minidump. - (WCHAR *)wpipe_name.c_str(), - NULL); //No custom client info. - if (mExceptionHandler) - { - break; - } - else - { - ::Sleep(100); //Wait a tick and try again. - } - } - if (!mExceptionHandler) - { - llwarns << "Failed to initialize OOP exception handler. Defaulting to In Process handling" << llendl; - mExceptionHandler = new google_breakpad::ExceptionHandler( - std::wstring(mDumpPath.begin(),mDumpPath.end()), //Dump path - 0, //dump filename - windows_post_minidump_callback, - 0, - google_breakpad::ExceptionHandler::HANDLER_ALL); - } + mExceptionHandler = new google_breakpad::ExceptionHandler( + std::wstring(mDumpPath.begin(),mDumpPath.end()), //Dump path + 0, //dump filename + windows_post_minidump_callback, + 0, + google_breakpad::ExceptionHandler::HANDLER_ALL); if (mExceptionHandler) { mExceptionHandler->set_handle_debug_exceptions(true); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 5758fb5c4..8630ed1f9 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -522,61 +522,7 @@ bool LLAppViewerWin32::restoreErrorTrap() void LLAppViewerWin32::initCrashReporting(bool reportFreeze) { - /* Singu Note: don't fork the crash logger on start - const char* logger_name = "win_crash_logger.exe"; - std::string exe_path = gDirUtilp->getExecutableDir(); - exe_path += gDirUtilp->getDirDelimiter(); - exe_path += logger_name; - - std::stringstream pid_str; - pid_str << LLApp::getPid(); - std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, ""); - std::string appname = gDirUtilp->getExecutableFilename(); - - S32 slen = logdir.length() -1; - S32 end = slen; - while (logdir.at(end) == '/' || logdir.at(end) == '\\') end--; - - if (slen !=end) - { - logdir = logdir.substr(0,end+1); - } - std::string arg_str = "\"" + exe_path + "\" -dumpdir \"" + logdir + "\" -procname \"" + appname + "\" -pid " + pid_str.str(); - llinfos << "spawning " << arg_str << llendl; - _spawnl(_P_NOWAIT, exe_path.c_str(), arg_str.c_str(), NULL); - */ - -/* STARTUPINFO siStartupInfo; - - std::string arg_str = "-dumpdir \"" + logdir + "\" -procname \"" + appname + "\" -pid " + pid_str.str(); - - memset(&siStartupInfo, 0, sizeof(siStartupInfo)); - memset(&mCrashReporterProcessInfo, 0, sizeof(mCrashReporterProcessInfo)); - - siStartupInfo.cb = sizeof(siStartupInfo); - - std::wstring exe_wstr; - exe_wstr.assign(exe_path.begin(), exe_path.end()); - - std::wstring arg_wstr; - arg_wstr.assign(arg_str.begin(), arg_str.end()); - - if(CreateProcess(&exe_wstr[0], - &arg_wstr[0], // Application arguments - 0, - 0, - FALSE, - CREATE_DEFAULT_ERROR_MODE, - 0, - 0, // Working directory - &siStartupInfo, - &mCrashReporterProcessInfo) == FALSE) - // Could not start application -> call 'GetLastError()' - { - //llinfos << "CreateProcess failed " << GetLastError() << llendl; - return; - } - */ + // Singu Note: we don't fork the crash logger on start } //virtual diff --git a/indra/newview/llcrashlogger.cpp b/indra/newview/llcrashlogger.cpp index ad96ba19c..d79db0fae 100644 --- a/indra/newview/llcrashlogger.cpp +++ b/indra/newview/llcrashlogger.cpp @@ -40,7 +40,10 @@ #include "llhttpclient.h" #include "llsdserialize.h" #include "llproxy.h" +#include "llwindow.h" +#include "lltrans.h" #include "aistatemachine.h" +#include "boost/filesystem.hpp" class AIHTTPTimeoutPolicy; extern AIHTTPTimeoutPolicy crashLoggerResponder_timeout; @@ -144,6 +147,36 @@ std::string getStartupStateFromLog(std::string& sllog) return startup_state; } +bool miniDumpExists(const std::string& dumpDir) +{ + bool found = false; + + try + { + if (!boost::filesystem::exists(dumpDir)) + { + return false; + } + + boost::filesystem::directory_iterator end_itr; + for (boost::filesystem::directory_iterator i(dumpDir); i != end_itr; ++i) + { + if (!boost::filesystem::is_regular_file(i->status())) continue; + if (".dmp" == i->path().extension()) + { + found = true; + break; + } + } + } + catch (const boost::filesystem::filesystem_error& e) + { + llwarns << "Failed to determine existance of the minidump file: '" + e.code().message() +"'" << llendl; + } + + return found; +} + bool LLCrashLogger::readDebugFromXML(LLSD& dest, const std::string& filename ) { std::string db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,filename); @@ -350,20 +383,29 @@ bool LLCrashLogger::sendCrashLog(std::string dump_dir) void LLCrashLogger::checkCrashDump() { - mCrashHost = gSavedSettings.getString("CrashHostUrl"); - - std::string dumpDir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "") + "singularity-debug"; - if (gDirUtilp->fileExists(dumpDir)) - { #if LL_SEND_CRASH_REPORTS - if (!mCrashHost.empty() && gSavedSettings.getS32("CrashSubmitBehavior") != 2) + // 0 - ask, 1 - always send, 2 - never send + S32 pref = gSavedSettings.getS32("CrashSubmitBehavior"); + if (pref == 2) return; //never send + + mCrashHost = gSavedSettings.getString("CrashHostUrl"); + std::string dumpDir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "") + "singularity-debug"; + + // Do we have something to send, and somewhere to send it + if (!mCrashHost.empty() && miniDumpExists(dumpDir)) + { + if (pref == 1) // always send { sendCrashLog(dumpDir); } + else // ask + { + U32 response = OSMessageBox(LLTrans::getString("MBFrozenCrashed"), LLTrans::getString("MBAlert"), OSMB_YESNO); + if (response == OSBTN_YES) + { + sendCrashLog(dumpDir); + } + } + } #endif - } - else - { - llinfos << "No crash dump found frome previous run, not sending report" << LL_ENDL; - } }