summaryrefslogtreecommitdiff
path: root/indra/llcrashlogger
diff options
context:
space:
mode:
authorErik Kundiman <erik@megapahit.org>2024-05-16 13:52:40 +0800
committerErik Kundiman <erik@megapahit.org>2024-05-16 13:52:40 +0800
commit6d51e91895a7f2435c46a876410ccc6c63fe8c82 (patch)
treef2b48ebd99cb414227bf365f47665b8d4baa752b /indra/llcrashlogger
parentd1b5917bb9c92e4e47eba19b43781e4d1328b1ca (diff)
parent094dcc07f8c1d90ae723dbe60eddacb90a09eae8 (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.cpp150
-rw-r--r--indra/llcrashlogger/llcrashlock.h16
-rw-r--r--indra/llcrashlogger/llcrashlogger.cpp408
-rw-r--r--indra/llcrashlogger/llcrashlogger.h64
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;