diff options
author | Erik Kundiman <erik@megapahit.org> | 2024-05-16 13:52:40 +0800 |
---|---|---|
committer | Erik Kundiman <erik@megapahit.org> | 2024-05-16 13:52:40 +0800 |
commit | 6d51e91895a7f2435c46a876410ccc6c63fe8c82 (patch) | |
tree | f2b48ebd99cb414227bf365f47665b8d4baa752b /indra/llcrashlogger | |
parent | d1b5917bb9c92e4e47eba19b43781e4d1328b1ca (diff) | |
parent | 094dcc07f8c1d90ae723dbe60eddacb90a09eae8 (diff) |
Merge tag '7.1.7-release'
source for viewer 7.1.7.8974243247
Diffstat (limited to 'indra/llcrashlogger')
-rw-r--r-- | indra/llcrashlogger/llcrashlock.cpp | 150 | ||||
-rw-r--r-- | indra/llcrashlogger/llcrashlock.h | 16 | ||||
-rw-r--r-- | indra/llcrashlogger/llcrashlogger.cpp | 408 | ||||
-rw-r--r-- | indra/llcrashlogger/llcrashlogger.h | 64 |
4 files changed, 319 insertions, 319 deletions
diff --git a/indra/llcrashlogger/llcrashlock.cpp b/indra/llcrashlogger/llcrashlock.cpp index 18d164abde..506232ab2a 100644 --- a/indra/llcrashlogger/llcrashlock.cpp +++ b/indra/llcrashlogger/llcrashlock.cpp @@ -1,4 +1,4 @@ -/** +/** * @file llformat.cpp * @date January 2007 * @brief string formatting utility @@ -6,21 +6,21 @@ * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -33,7 +33,7 @@ #include "llsd.h" #include "llsdserialize.h" #include "llframetimer.h" -#include <boost/filesystem.hpp> +#include <boost/filesystem.hpp> #include <string> #include <iostream> #include <stdio.h> @@ -45,49 +45,49 @@ bool LLCrashLock::isProcessAlive(U32 pid, const std::string& pname) { - std::wstring wpname; - wpname = std::wstring(pname.begin(), pname.end()); - - HANDLE snapshot; - PROCESSENTRY32 pe32; - - bool matched = false; - - snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - if (snapshot == INVALID_HANDLE_VALUE) - { - return false; - } - else - { - pe32.dwSize = sizeof(PROCESSENTRY32); - if (Process32First(snapshot, &pe32)) - { - do { - std::wstring wexecname = pe32.szExeFile; - std::string execname = std::string(wexecname.begin(), wexecname.end()); - if (!wpname.compare(pe32.szExeFile)) - { - if (pid == (U32)pe32.th32ProcessID) - { - matched = true; - break; - } - } - } while (Process32Next(snapshot, &pe32)); - } - } - - CloseHandle(snapshot); - return matched; + std::wstring wpname; + wpname = std::wstring(pname.begin(), pname.end()); + + HANDLE snapshot; + PROCESSENTRY32 pe32; + + bool matched = false; + + snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (snapshot == INVALID_HANDLE_VALUE) + { + return false; + } + else + { + pe32.dwSize = sizeof(PROCESSENTRY32); + if (Process32First(snapshot, &pe32)) + { + do { + std::wstring wexecname = pe32.szExeFile; + std::string execname = std::string(wexecname.begin(), wexecname.end()); + if (!wpname.compare(pe32.szExeFile)) + { + if (pid == (U32)pe32.th32ProcessID) + { + matched = true; + break; + } + } + } while (Process32Next(snapshot, &pe32)); + } + } + + CloseHandle(snapshot); + return matched; } #else //Everyone Else bool LLCrashLock::isProcessAlive(U32 pid, const std::string& pname) { - //Will boost.process ever become a reality? + //Will boost.process ever become a reality? std::stringstream cmd; - + cmd << "pgrep '" << pname << "' | grep '^" << pid << "$'"; return (!system(cmd.str().c_str())); } @@ -101,46 +101,46 @@ LLCrashLock::LLCrashLock() : mCleanUp(true), mWaitingPID(0) void LLCrashLock::setCleanUp(bool cleanup) { mCleanUp = cleanup; //Allow cleanup to be disabled for debugging. -} +} LLSD LLCrashLock::getLockFile(std::string filename) { - LLSD lock_sd = LLSD::emptyMap(); - - llifstream ifile(filename.c_str()); - - if (ifile.is_open()) - { + LLSD lock_sd = LLSD::emptyMap(); + + llifstream ifile(filename.c_str()); + + if (ifile.is_open()) + { LLSDSerialize::fromXML(lock_sd, ifile); - ifile.close(); - } + ifile.close(); + } return lock_sd; } bool LLCrashLock::putLockFile(std::string filename, const LLSD& data) -{ +{ bool result = true; llofstream ofile(filename.c_str()); - - if (!LLSDSerialize::toXML(data,ofile)) - { + + if (!LLSDSerialize::toXML(data,ofile)) + { result=false; - } - ofile.close(); + } + ofile.close(); return result; } bool LLCrashLock::requestMaster( F32 timeout ) { - if (mMaster.empty()) - { - mMaster = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, + if (mMaster.empty()) + { + mMaster = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crash_master.lock"); - } + } LLSD lock_sd=getLockFile(mMaster); - + if (lock_sd.has("pid")) { mWaitingPID = lock_sd["pid"].asInteger(); @@ -150,8 +150,8 @@ bool LLCrashLock::requestMaster( F32 timeout ) return false; } } - - U32 pid = getpid(); + + U32 pid = getpid(); lock_sd["pid"] = (LLSD::Integer)pid; return putLockFile(mMaster,lock_sd); } @@ -179,10 +179,10 @@ void LLCrashLock::releaseMaster() LLSD LLCrashLock::getProcessList() { if (mDumpTable.empty()) - { - mDumpTable= gDirUtilp->getExpandedFilename(LL_PATH_LOGS, - "crash_table.lock"); - } + { + mDumpTable= gDirUtilp->getExpandedFilename(LL_PATH_LOGS, + "crash_table.lock"); + } return getLockFile(mDumpTable); } @@ -190,21 +190,21 @@ LLSD LLCrashLock::getProcessList() bool LLCrashLock::fileExists(std::string filename) { #ifdef LL_WINDOWS // or BOOST_WINDOWS_API - boost::filesystem::path file_path(utf8str_to_utf16str(filename)); + boost::filesystem::path file_path(utf8str_to_utf16str(filename)); #else - boost::filesystem::path file_path(filename); + boost::filesystem::path file_path(filename); #endif - return boost::filesystem::exists(file_path); + return boost::filesystem::exists(file_path); } void LLCrashLock::cleanupProcess(std::string proc_dir) { #ifdef LL_WINDOWS // or BOOST_WINDOWS_API - boost::filesystem::path dir_path(utf8str_to_utf16str(proc_dir)); + boost::filesystem::path dir_path(utf8str_to_utf16str(proc_dir)); #else - boost::filesystem::path dir_path(proc_dir); + boost::filesystem::path dir_path(proc_dir); #endif - boost::filesystem::remove_all(dir_path); + boost::filesystem::remove_all(dir_path); } bool LLCrashLock::putProcessList(const LLSD& proc_sd) diff --git a/indra/llcrashlogger/llcrashlock.h b/indra/llcrashlogger/llcrashlock.h index 60b060b736..b20555b746 100644 --- a/indra/llcrashlogger/llcrashlock.h +++ b/indra/llcrashlogger/llcrashlock.h @@ -1,25 +1,25 @@ -/** +/** * @file llcrashlock.h * @brief Maintainence of disk locking files for crash reporting * * $LicenseInfo:firstyear=2001&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -31,7 +31,7 @@ class LLSD; -#if !LL_WINDOWS //For non-windows platforms. +#if !LL_WINDOWS //For non-windows platforms. #include <signal.h> #endif @@ -51,8 +51,8 @@ public: LLSD getProcessList(); //Get next process pid/dir pairs void cleanupProcess(std::string proc_dir); //Remove from list, clean up working dir. bool putProcessList(const LLSD& processlist); //Write pid/dir pairs back to disk. - static bool fileExists(std::string filename); - + static bool fileExists(std::string filename); + //getters S32 getPID(); diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp index bb603d3d7f..b36f89b750 100644 --- a/indra/llcrashlogger/llcrashlogger.cpp +++ b/indra/llcrashlogger/llcrashlogger.cpp @@ -1,25 +1,25 @@ - /** + /** * @file llcrashlogger.cpp * @brief Crash logger implementation * * $LicenseInfo:firstyear=2003&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. -* +* * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. -* +* * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. -* +* * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -* +* * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -33,7 +33,7 @@ #include "llcrashlock.h" #include "linden_common.h" #include "llstring.h" -#include "indra_constants.h" // CRASH_BEHAVIOR_... +#include "indra_constants.h" // CRASH_BEHAVIOR_... #include "llerror.h" #include "llerrorcontrol.h" #include "lltimer.h" @@ -86,11 +86,11 @@ void LLCrashLoggerHandler::onFailure(LLCore::HttpResponse * response, LLCore::Ht } LLCrashLogger::LLCrashLogger() : - mCrashBehavior(CRASH_BEHAVIOR_ALWAYS_SEND), - mCrashInPreviousExec(false), - mCrashSettings("CrashSettings"), - mSentCrashLogs(false), - mCrashHost("") + mCrashBehavior(CRASH_BEHAVIOR_ALWAYS_SEND), + mCrashInPreviousExec(false), + mCrashSettings("CrashSettings"), + mSentCrashLogs(false), + mCrashHost("") { } @@ -105,63 +105,63 @@ const int LINE_SEARCH_DIST = 500; const std::string SKIP_TEXT = "\n ...Skipping... \n"; void trimSLLog(std::string& sllog) { - if(sllog.length() > TRIM_SIZE * 2) - { - std::string::iterator head = sllog.begin() + TRIM_SIZE; - std::string::iterator tail = sllog.begin() + sllog.length() - TRIM_SIZE; - std::string::iterator new_head = std::find(head, head - LINE_SEARCH_DIST, '\n'); - if(new_head != head - LINE_SEARCH_DIST) - { - head = new_head; - } - - std::string::iterator new_tail = std::find(tail, tail + LINE_SEARCH_DIST, '\n'); - if(new_tail != tail + LINE_SEARCH_DIST) - { - tail = new_tail; - } - - sllog.erase(head, tail); - sllog.insert(head, SKIP_TEXT.begin(), SKIP_TEXT.end()); - } + if(sllog.length() > TRIM_SIZE * 2) + { + std::string::iterator head = sllog.begin() + TRIM_SIZE; + std::string::iterator tail = sllog.begin() + sllog.length() - TRIM_SIZE; + std::string::iterator new_head = std::find(head, head - LINE_SEARCH_DIST, '\n'); + if(new_head != head - LINE_SEARCH_DIST) + { + head = new_head; + } + + std::string::iterator new_tail = std::find(tail, tail + LINE_SEARCH_DIST, '\n'); + if(new_tail != tail + LINE_SEARCH_DIST) + { + tail = new_tail; + } + + sllog.erase(head, tail); + sllog.insert(head, SKIP_TEXT.begin(), SKIP_TEXT.end()); + } } std::string getStartupStateFromLog(std::string& sllog) { - std::string startup_state = "STATE_FIRST"; - std::string startup_token = "Startup state changing from "; - - int index = sllog.rfind(startup_token); - if (index < 0 || index + startup_token.length() > sllog.length()) { - return startup_state; - } - - // find new line - char cur_char = sllog[index + startup_token.length()]; - std::string::size_type newline_loc = index + startup_token.length(); - while(cur_char != '\n' && newline_loc < sllog.length()) - { - newline_loc++; - cur_char = sllog[newline_loc]; - } - - // get substring and find location of " to " - std::string state_line = sllog.substr(index, newline_loc - index); - std::string::size_type state_index = state_line.find(" to "); - startup_state = state_line.substr(state_index + 4, state_line.length() - state_index - 4); - - return startup_state; + std::string startup_state = "STATE_FIRST"; + std::string startup_token = "Startup state changing from "; + + int index = sllog.rfind(startup_token); + if (index < 0 || index + startup_token.length() > sllog.length()) { + return startup_state; + } + + // find new line + char cur_char = sllog[index + startup_token.length()]; + std::string::size_type newline_loc = index + startup_token.length(); + while(cur_char != '\n' && newline_loc < sllog.length()) + { + newline_loc++; + cur_char = sllog[newline_loc]; + } + + // get substring and find location of " to " + std::string state_line = sllog.substr(index, newline_loc - index); + std::string::size_type state_index = state_line.find(" to "); + startup_state = state_line.substr(state_index + 4, state_line.length() - state_index - 4); + + return startup_state; } bool LLCrashLogger::readFromXML(LLSD& dest, const std::string& filename ) { - std::string db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,filename); - llifstream log_file(db_file_name.c_str()); + std::string db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,filename); + llifstream log_file(db_file_name.c_str()); - // Look for it in the given file - if (log_file.is_open()) - { - LLSDSerialize::fromXML(dest, log_file); + // Look for it in the given file + if (log_file.is_open()) + { + LLSDSerialize::fromXML(dest, log_file); log_file.close(); return true; } @@ -175,8 +175,8 @@ bool LLCrashLogger::readFromXML(LLSD& dest, const std::string& filename ) void LLCrashLogger::mergeLogs( LLSD src_sd ) { LLSD::map_iterator iter = src_sd.beginMap(); - LLSD::map_iterator end = src_sd.endMap(); - for( ; iter != end; ++iter) + LLSD::map_iterator end = src_sd.endMap(); + for( ; iter != end; ++iter) { mDebugLog[iter->first] = iter->second; } @@ -184,35 +184,35 @@ void LLCrashLogger::mergeLogs( LLSD src_sd ) bool LLCrashLogger::readMinidump(std::string minidump_path) { - size_t length=0; + size_t length=0; - llifstream minidump_stream(minidump_path.c_str(), std::ios_base::in | std::ios_base::binary); - if(minidump_stream.is_open()) - { - minidump_stream.seekg(0, std::ios::end); - length = (size_t)minidump_stream.tellg(); + llifstream minidump_stream(minidump_path.c_str(), std::ios_base::in | std::ios_base::binary); + if(minidump_stream.is_open()) + { + minidump_stream.seekg(0, std::ios::end); + length = (size_t)minidump_stream.tellg(); LL_WARNS("CRASHREPORT") << "minidump length "<< length <<LL_ENDL; - minidump_stream.seekg(0, std::ios::beg); - - LLSD::Binary data; - data.resize(length); - - minidump_stream.read(reinterpret_cast<char *>(&(data[0])),length); - minidump_stream.close(); - - mCrashInfo["Minidump"] = data; - } + minidump_stream.seekg(0, std::ios::beg); + + LLSD::Binary data; + data.resize(length); + + minidump_stream.read(reinterpret_cast<char *>(&(data[0])),length); + minidump_stream.close(); + + mCrashInfo["Minidump"] = data; + } else { LL_WARNS("CRASHREPORT") << "failed to open minidump "<<minidump_path<<LL_ENDL; } - - return (length>0?true:false); + + return (length>0?true:false); } void LLCrashLogger::gatherFiles() { - updateApplication("Gathering logs..."); + updateApplication("Gathering logs..."); LLSD static_sd; LLSD dynamic_sd; @@ -222,50 +222,50 @@ void LLCrashLogger::gatherFiles() LLSD endpoint; std::string grid; std::string fqdn; - + bool has_logs = readFromXML( static_sd, "static_debug_info.log" ); has_logs |= readFromXML( dynamic_sd, "dynamic_debug_info.log" ); - + if ( has_logs ) { mDebugLog = static_sd; mergeLogs(dynamic_sd); - mCrashInPreviousExec = mDebugLog["CrashNotHandled"].asBoolean(); + mCrashInPreviousExec = mDebugLog["CrashNotHandled"].asBoolean(); - mFileMap["SecondLifeLog"] = mDebugLog["SLLog"].asString(); - mFileMap["SettingsXml"] = mDebugLog["SettingsFilename"].asString(); + mFileMap["SecondLifeLog"] = mDebugLog["SLLog"].asString(); + mFileMap["SettingsXml"] = mDebugLog["SettingsFilename"].asString(); mFileMap["CrashHostUrl"] = loadCrashURLSetting(); - if(mDebugLog.has("CAFilename")) - { + if(mDebugLog.has("CAFilename")) + { LLCore::HttpRequest::setStaticPolicyOption(LLCore::HttpRequest::PO_CA_FILE, LLCore::HttpRequest::GLOBAL_POLICY_ID, mDebugLog["CAFilename"].asString(), NULL); - } - else - { + } + else + { LLCore::HttpRequest::setStaticPolicyOption(LLCore::HttpRequest::PO_CA_FILE, LLCore::HttpRequest::GLOBAL_POLICY_ID, gDirUtilp->getCAFile(), NULL); - } - - LL_INFOS("CRASHREPORT") << "Using log file from debug log " << mFileMap["SecondLifeLog"] << LL_ENDL; - LL_INFOS("CRASHREPORT") << "Using settings file from debug log " << mFileMap["SettingsXml"] << LL_ENDL; - } - else - { - // Figure out the filename of the second life log + } + + LL_INFOS("CRASHREPORT") << "Using log file from debug log " << mFileMap["SecondLifeLog"] << LL_ENDL; + LL_INFOS("CRASHREPORT") << "Using settings file from debug log " << mFileMap["SettingsXml"] << LL_ENDL; + } + else + { + // Figure out the filename of the second life log LLCore::HttpRequest::setStaticPolicyOption(LLCore::HttpRequest::PO_CA_FILE, LLCore::HttpRequest::GLOBAL_POLICY_ID, gDirUtilp->getCAFile(), NULL); - - mFileMap["SecondLifeLog"] = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,"SecondLife.log"); + + mFileMap["SecondLifeLog"] = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,"SecondLife.log"); mFileMap["SettingsXml"] = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.xml"); - } + } if (!gDirUtilp->fileExists(mFileMap["SecondLifeLog"]) ) //We would prefer to get this from the per-run but here's our fallback. { mFileMap["SecondLifeLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.old"); } - gatherPlatformSpecificFiles(); + gatherPlatformSpecificFiles(); if ( has_logs && (mFileMap["CrashHostUrl"] != "") ) @@ -273,16 +273,16 @@ void LLCrashLogger::gatherFiles() mCrashHost = mFileMap["CrashHostUrl"]; } - //default to agni, per product - mAltCrashHost = "http://viewercrashreport.agni.lindenlab.com/cgi-bin/viewercrashreceiver.py"; + //default to agni, per product + mAltCrashHost = "http://viewercrashreport.agni.lindenlab.com/cgi-bin/viewercrashreceiver.py"; - mCrashInfo["DebugLog"] = mDebugLog; - mFileMap["StatsLog"] = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,"stats.log"); - - updateApplication("Encoding files..."); + mCrashInfo["DebugLog"] = mDebugLog; + mFileMap["StatsLog"] = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,"stats.log"); - for(std::map<std::string, std::string>::iterator itr = mFileMap.begin(); itr != mFileMap.end(); ++itr) - { + updateApplication("Encoding files..."); + + for(std::map<std::string, std::string>::iterator itr = mFileMap.begin(); itr != mFileMap.end(); ++itr) + { std::string file = (*itr).second; if (!file.empty()) { @@ -314,17 +314,17 @@ void LLCrashLogger::gatherFiles() { LL_DEBUGS("CRASHREPORT") << "empty file in list for " << itr->first << LL_ENDL; } - } - - std::string minidump_path; - // Add minidump as binary. + } + + std::string minidump_path; + // Add minidump as binary. bool has_minidump = mDebugLog.has("MinidumpPath"); - - if (has_minidump) - { - minidump_path = mDebugLog["MinidumpPath"].asString(); - has_minidump = readMinidump(minidump_path); - } + + if (has_minidump) + { + minidump_path = mDebugLog["MinidumpPath"].asString(); + has_minidump = readMinidump(minidump_path); + } else { LL_WARNS("CRASHREPORT") << "DebugLog does not have MinidumpPath" << LL_ENDL; @@ -347,12 +347,12 @@ void LLCrashLogger::gatherFiles() { char buf[5]; fdat.read(buf,4); - fdat.close(); + fdat.close(); if (!strncmp(buf,"MDMP",4)) { minidump_path = *iter; has_minidump = readMinidump(fullname); - mDebugLog["MinidumpPath"] = fullname; + mDebugLog["MinidumpPath"] = fullname; } else { @@ -367,7 +367,7 @@ void LLCrashLogger::gatherFiles() else { LL_DEBUGS("CRASHREPORT") << "Name does not match minidump name pattern " << *iter << LL_ENDL; - } + } } } else @@ -378,7 +378,7 @@ void LLCrashLogger::gatherFiles() LLSD LLCrashLogger::constructPostData() { - return mCrashInfo; + return mCrashInfo; } const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml"; @@ -386,14 +386,14 @@ const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml"; std::string LLCrashLogger::loadCrashURLSetting() { - // First check user_settings (in the user's home dir) - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); - if (! mCrashSettings.loadFromFile(filename)) - { - // Next check app_settings (in the SL program dir) - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, CRASH_SETTINGS_FILE); - mCrashSettings.loadFromFile(filename); - } + // First check user_settings (in the user's home dir) + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); + if (! mCrashSettings.loadFromFile(filename)) + { + // Next check app_settings (in the SL program dir) + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, CRASH_SETTINGS_FILE); + mCrashSettings.loadFromFile(filename); + } if (! mCrashSettings.controlExists("CrashHostUrl")) { @@ -413,9 +413,9 @@ bool LLCrashLogger::runCrashLogPost(std::string host, LLSD data, std::string msg httpOpts->setTimeout(timeout); httpOpts->setSSLVerifyPeer(false); - for(int i = 0; i < retries; ++i) - { - updateApplication(llformat("%s, try %d...", msg.c_str(), i+1)); + for(int i = 0; i < retries; ++i) + { + updateApplication(llformat("%s, try %d...", msg.c_str(), i+1)); LL_INFOS("CRASHREPORT") << "POST crash data to " << host << LL_ENDL; LLCore::HttpHandle handle = LLCoreHttpUtil::requestPostWithLLSD(httpRequest.get(), LLCore::HttpRequest::DEFAULT_POLICY_ID, @@ -435,61 +435,61 @@ bool LLCrashLogger::runCrashLogPost(std::string host, LLSD data, std::string msg updateApplication(); // No new message, just pump the IO httpRequest->update(0L); } - if(gSent) - { - return gSent; - } + if(gSent) + { + return gSent; + } LL_WARNS("CRASHREPORT") << "Failed to send crash report to \"" << host << "\"" << LL_ENDL; - } - return gSent; + } + return gSent; } bool LLCrashLogger::sendCrashLog(std::string dump_dir) { gDirUtilp->setDumpDir( dump_dir ); - + std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLifeCrashReport"); std::string report_file = dump_path + ".log"; LL_DEBUGS("CRASHREPORT") << "sending " << report_file << LL_ENDL; - gatherFiles(); - - LLSD post_data; - post_data = constructPostData(); - - updateApplication("Sending reports..."); + gatherFiles(); - llofstream out_file(report_file.c_str()); - LLSDSerialize::toPrettyXML(post_data, out_file); + LLSD post_data; + post_data = constructPostData(); + + updateApplication("Sending reports..."); + + llofstream out_file(report_file.c_str()); + LLSDSerialize::toPrettyXML(post_data, out_file); out_file.flush(); - out_file.close(); - - bool sent = false; - + out_file.close(); + + bool sent = false; + if(mCrashHost != "") - { + { LL_WARNS("CRASHREPORT") << "Sending crash data to server from CrashHostUrl '" << mCrashHost << "'" << LL_ENDL; - + std::string msg = "Using override crash server... "; msg = msg+mCrashHost.c_str(); updateApplication(msg.c_str()); - - sent = runCrashLogPost(mCrashHost, post_data, std::string("Sending to server"), CRASH_UPLOAD_RETRIES, CRASH_UPLOAD_TIMEOUT); - } - - if(!sent) - { + + sent = runCrashLogPost(mCrashHost, post_data, std::string("Sending to server"), CRASH_UPLOAD_RETRIES, CRASH_UPLOAD_TIMEOUT); + } + + if(!sent) + { updateApplication("Using default server..."); - sent = runCrashLogPost(mAltCrashHost, post_data, std::string("Sending to default server"), CRASH_UPLOAD_RETRIES, CRASH_UPLOAD_TIMEOUT); - } - - mSentCrashLogs = sent; - - return sent; + sent = runCrashLogPost(mAltCrashHost, post_data, std::string("Sending to default server"), CRASH_UPLOAD_RETRIES, CRASH_UPLOAD_TIMEOUT); + } + + mSentCrashLogs = sent; + + return sent; } bool LLCrashLogger::sendCrashLogs() @@ -497,16 +497,16 @@ bool LLCrashLogger::sendCrashLogs() LLSD locks = mKeyMaster.getProcessList(); LLSD newlocks = LLSD::emptyArray(); - LLSD opts = getOptionData(PRIORITY_COMMAND_LINE); + LLSD opts = getOptionData(PRIORITY_COMMAND_LINE); LLSD rec; - if ( opts.has("pid") && opts.has("dumpdir") && opts.has("procname") ) + if ( opts.has("pid") && opts.has("dumpdir") && opts.has("procname") ) { rec["pid"]=opts["pid"]; rec["dumpdir"]=opts["dumpdir"]; rec["procname"]=opts["procname"]; } - + if (locks.isArray()) { for (LLSD::array_iterator lock=locks.beginArray(); @@ -521,11 +521,11 @@ bool LLCrashLogger::sendCrashLogs() } else { - //TODO: This is a hack but I didn't want to include boost in another file or retest everything related to lldir + //TODO: This is a hack but I didn't want to include boost in another file or retest everything related to lldir if (LLCrashLock::fileExists((*lock)["dumpdir"].asString())) { //the viewer cleans up the log directory on clean shutdown - //but is ignorant of the locking table. + //but is ignorant of the locking table. if (!sendCrashLog((*lock)["dumpdir"].asString())) { newlocks.append(*lock); //Failed to send log so don't delete it. @@ -535,7 +535,7 @@ bool LLCrashLogger::sendCrashLogs() mKeyMaster.cleanupProcess((*lock)["dumpdir"].asString()); } } - } + } } else { @@ -548,59 +548,59 @@ bool LLCrashLogger::sendCrashLogs() { newlocks.append(rec); } - + mKeyMaster.putProcessList(newlocks); return true; } void LLCrashLogger::updateApplication(const std::string& message) { - if (!message.empty()) LL_INFOS("CRASHREPORT") << message << LL_ENDL; + if (!message.empty()) LL_INFOS("CRASHREPORT") << message << LL_ENDL; } bool LLCrashLogger::init() { LL_DEBUGS("CRASHREPORT") << LL_ENDL; - + LLCore::LLHttp::initialize(); - // We assume that all the logs we're looking for reside on the current drive - gDirUtilp->initAppDirs("SecondLife"); + // We assume that all the logs we're looking for reside on the current drive + gDirUtilp->initAppDirs("SecondLife"); - LLError::initForApplication(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""), gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); + LLError::initForApplication(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""), gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); - // Default to the product name "Second Life" (this is overridden by the -name argument) - mProductName = "Second Life"; + // Default to the product name "Second Life" (this is overridden by the -name argument) + mProductName = "Second Life"; - // Rename current log file to ".old" - std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log.old"); - std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log"); + // Rename current log file to ".old" + std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log.old"); + std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log"); #if LL_WINDOWS - LLAPRFile::remove(old_log_file); -#endif + LLAPRFile::remove(old_log_file); +#endif - LLFile::rename(log_file.c_str(), old_log_file.c_str()); - - // Set the log file to crashreport.log - LLError::logToFile(log_file); //NOTE: Until this line, LL_INFOS LL_WARNS, etc are blown to the ether. + LLFile::rename(log_file.c_str(), old_log_file.c_str()); + + // Set the log file to crashreport.log + LLError::logToFile(log_file); //NOTE: Until this line, LL_INFOS LL_WARNS, etc are blown to the ether. LL_INFOS("CRASHREPORT") << "Crash reporter file rotation complete." << LL_ENDL; // Handle locking bool locked = mKeyMaster.requestMaster(); //Request master locking file. wait time is defaulted to 300S - + while (!locked && mKeyMaster.isWaiting()) { - LL_INFOS("CRASHREPORT") << "Waiting for lock." << LL_ENDL; + LL_INFOS("CRASHREPORT") << "Waiting for lock." << LL_ENDL; #if LL_WINDOWS - Sleep(1000); + Sleep(1000); #else ::sleep(1); -#endif +#endif locked = mKeyMaster.checkMaster(); } - + if (!locked) { LL_WARNS("CRASHREPORT") << "Unable to get master lock. Another crash reporter may be hung." << LL_ENDL; @@ -608,24 +608,24 @@ bool LLCrashLogger::init() } mCrashSettings.declareS32("CrashSubmitBehavior", CRASH_BEHAVIOR_ALWAYS_SEND, - "Controls behavior when viewer crashes " - "(0 = ask before sending crash report, " - "1 = always send crash report, " - "2 = never send crash report)"); - + "Controls behavior when viewer crashes " + "(0 = ask before sending crash report, " + "1 = always send crash report, " + "2 = never send crash report)"); + init_curl(); LLCore::HttpRequest::createService(); LLCore::HttpRequest::startThread(); - return true; + return true; } // For cleanup code common to all platforms. void LLCrashLogger::commonCleanup() { term_curl(); - LLError::logToFile(""); //close crashreport.log - SUBSYSTEM_CLEANUP(LLProxy); + LLError::logToFile(""); //close crashreport.log + SUBSYSTEM_CLEANUP(LLProxy); } void LLCrashLogger::init_curl() diff --git a/indra/llcrashlogger/llcrashlogger.h b/indra/llcrashlogger/llcrashlogger.h index e3e8110a47..a5839b4622 100644 --- a/indra/llcrashlogger/llcrashlogger.h +++ b/indra/llcrashlogger/llcrashlogger.h @@ -1,25 +1,25 @@ -/** +/** * @file llcrashlogger.h * @brief Crash Logger Definition * * $LicenseInfo:firstyear=2003&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. -* +* * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. -* +* * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. -* +* * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -* +* * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -49,26 +49,26 @@ const S32 CRASH_BEHAVIOR_NEVER_SEND = 2; class LLCrashLogger : public LLApp { public: - LLCrashLogger(); - virtual ~LLCrashLogger(); - std::string loadCrashURLSetting(); + LLCrashLogger(); + virtual ~LLCrashLogger(); + std::string loadCrashURLSetting(); bool readFromXML(LLSD& dest, const std::string& filename ); - void gatherFiles(); + void gatherFiles(); void mergeLogs( LLSD src_sd ); - virtual void gatherPlatformSpecificFiles() {} + virtual void gatherPlatformSpecificFiles() {} bool sendCrashLog(std::string dump_dir); - bool sendCrashLogs(); - LLSD constructPostData(); - virtual void updateApplication(const std::string& message = LLStringUtil::null); - virtual bool init(); - virtual bool frame() = 0; - virtual bool cleanup() = 0; - void commonCleanup(); - void setUserText(const std::string& text) { mCrashInfo["UserNotes"] = text; } - S32 getCrashBehavior() { return mCrashBehavior; } - bool runCrashLogPost(std::string host, LLSD data, std::string msg, int retries, int timeout); - bool readMinidump(std::string minidump_path); + bool sendCrashLogs(); + LLSD constructPostData(); + virtual void updateApplication(const std::string& message = LLStringUtil::null); + virtual bool init(); + virtual bool frame() = 0; + virtual bool cleanup() = 0; + void commonCleanup(); + void setUserText(const std::string& text) { mCrashInfo["UserNotes"] = text; } + S32 getCrashBehavior() { return mCrashBehavior; } + bool runCrashLogPost(std::string host, LLSD data, std::string msg, int retries, int timeout); + bool readMinidump(std::string minidump_path); protected: static void init_curl(); @@ -76,17 +76,17 @@ protected: static void ssl_thread_id_callback(CRYPTO_THREADID*); static void ssl_locking_callback(int mode, int type, const char * file, int line); - S32 mCrashBehavior; - BOOL mCrashInPreviousExec; - std::map<std::string, std::string> mFileMap; - std::string mGridName; - LLControlGroup mCrashSettings; - std::string mProductName; - LLSD mCrashInfo; - std::string mCrashHost; - std::string mAltCrashHost; - LLSD mDebugLog; - bool mSentCrashLogs; + S32 mCrashBehavior; + BOOL mCrashInPreviousExec; + std::map<std::string, std::string> mFileMap; + std::string mGridName; + LLControlGroup mCrashSettings; + std::string mProductName; + LLSD mCrashInfo; + std::string mCrashHost; + std::string mAltCrashHost; + LLSD mDebugLog; + bool mSentCrashLogs; LLCrashLock mKeyMaster; static int ssl_mutex_count; |