summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Glazer <coyot@lindenlab.com>2016-02-25 10:34:18 -0800
committerGlenn Glazer <coyot@lindenlab.com>2016-02-25 10:34:18 -0800
commitaca314de1f74bc4cab06dfc4b99e6604213b22b5 (patch)
tree5a30de3ebd0828c22a7edbd314c38ff011c77703
parent281521fe42facc08c00ea6df902e31a6749d6eea (diff)
parentb09f0a120e53c8b27d196df6a33a42c9ac0e146c (diff)
maint-5974/maint-5422: viewer changes for new crash reporting
-rwxr-xr-xindra/llcrashlogger/llcrashlogger.cpp181
-rwxr-xr-xindra/llcrashlogger/llcrashlogger.h2
-rwxr-xr-xindra/mac_crash_logger/llcrashloggermac.cpp3
-rwxr-xr-xindra/mac_crash_logger/mac_crash_logger.cpp11
-rwxr-xr-xindra/newview/llappviewermacosx.cpp5
5 files changed, 85 insertions, 117 deletions
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index 7a97c16ea7..b1cf20cc8e 100755
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -39,12 +39,14 @@
#include "lltimer.h"
#include "lldir.h"
#include "llfile.h"
-#include "llsdserialize.h"
#include "lliopipe.h"
#include "llpumpio.h"
#include "llhttpclient.h"
#include "llsdserialize.h"
#include "llproxy.h"
+#include "llsdutil.h" //remove
+
+#include <boost/regex.hpp>
LLPumpIO* gServicePump = NULL;
BOOL gBreak = false;
@@ -140,16 +142,16 @@ std::string getStartupStateFromLog(std::string& sllog)
return startup_state;
}
-bool LLCrashLogger::readDebugFromXML(LLSD& dest, const std::string& filename )
+bool LLCrashLogger::readFromXML(LLSD& dest, const std::string& filename )
{
std::string db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,filename);
- std::ifstream debug_log_file(db_file_name.c_str());
+ std::ifstream log_file(db_file_name.c_str());
- // Look for it in the debug_info.log file
- if (debug_log_file.is_open())
+ // Look for it in the given file
+ if (log_file.is_open())
{
- LLSDSerialize::fromXML(dest, debug_log_file);
- debug_log_file.close();
+ LLSDSerialize::fromXML(dest, log_file);
+ log_file.close();
return true;
}
return false;
@@ -193,9 +195,18 @@ void LLCrashLogger::gatherFiles()
LLSD static_sd;
LLSD dynamic_sd;
+ //if we ever want to change the endpoint we send crashes to
+ //we can construct a file download ( a la feature table filename for example)
+ //containing the new endpoint
+ LLSD endpoint;
+ std::string grid;
+ std::string fqdn;
+
- bool has_logs = readDebugFromXML( static_sd, "static_debug_info.log" );
- has_logs |= readDebugFromXML( dynamic_sd, "dynamic_debug_info.log" );
+ bool has_logs = readFromXML( static_sd, "static_debug_info.log" );
+ has_logs |= readFromXML( dynamic_sd, "dynamic_debug_info.log" );
+ bool has_endpoint = readFromXML( endpoint, "endpoint.xml" );
+
if ( has_logs )
{
@@ -233,31 +244,41 @@ void LLCrashLogger::gatherFiles()
gatherPlatformSpecificFiles();
- //Use the debug log to reconstruct the URL to send the crash report to
- if(mDebugLog.has("CrashHostUrl"))
- {
- // Crash log receiver has been manually configured.
- mCrashHost = mDebugLog["CrashHostUrl"].asString();
- }
- else if(mDebugLog.has("CurrentSimHost"))
- {
- mCrashHost = "https://";
- mCrashHost += mDebugLog["CurrentSimHost"].asString();
- mCrashHost += ":12043/crash/report";
- }
- else if(mDebugLog.has("GridName"))
- {
- // This is a 'little' hacky, but its the best simple solution.
- std::string grid_host = mDebugLog["GridName"].asString();
- LLStringUtil::toLower(grid_host);
- mCrashHost = "https://login.";
- mCrashHost += grid_host;
- mCrashHost += ".lindenlab.com:12043/crash/report";
- }
+ if ( has_endpoint && endpoint.has("ViewerCrashReceiver" ) )
+ {
+ mCrashHost = endpoint["ViewerCrashReceiver"].asString();
+ }
+ else if ( has_logs )
+ {
+ //Use the debug log to reconstruct the URL to send the crash report to
+ if(mDebugLog.has("CurrentSimHost"))
+ {
+ mCrashHost = "http://viewercrashreport";
+ fqdn = mDebugLog["CurrentSimHost"].asString();
+ boost::regex sim_re( "sim[[:digit:]]+.[[:alpha:]]+.lindenlab.com" );
+ boost::match_results<std::string::const_iterator> results;
+ if ( regex_match( fqdn, sim_re ) )
+ {
+ boost::regex regex_delimited("\\.[[:alpha:]]+\\.");
+ boost::match_flag_type flags = boost::match_default;
+ std::string::const_iterator start = fqdn.begin();
+ std::string::const_iterator end = fqdn.end();
+ boost::regex_search(start, end, results, regex_delimited, flags);
+ grid = std::string(results[0].first, results[0].second);
+ mCrashHost += grid;
+ mCrashHost += "lindenlab.com/cgi-bin/viewercrashreceiver.py";
+ }
+ else
+ {
+ mCrashHost = "";
+ }
- // Use login servers as the alternate, since they are already load balanced and have a known name
- mAltCrashHost = "https://login.agni.lindenlab.com:12043/crash/report";
+ }
+ }
+
+ //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");
@@ -389,15 +410,15 @@ bool LLCrashLogger::saveCrashBehaviorSetting(S32 crash_behavior)
bool LLCrashLogger::runCrashLogPost(std::string host, LLSD data, std::string msg, int retries, int timeout)
{
- gBreak = false;
for(int i = 0; i < retries; ++i)
{
updateApplication(llformat("%s, try %d...", msg.c_str(), i+1));
LLHTTPClient::post(host, data, new LLCrashLoggerResponder(), timeout);
- while(!gBreak)
- {
- updateApplication(); // No new message, just pump the IO
- }
+ while(!gBreak)
+ {
+ ms_sleep(250);
+ updateApplication(); // No new message, just pump the IO
+ }
if(gSent)
{
return gSent;
@@ -408,12 +429,13 @@ bool LLCrashLogger::runCrashLogPost(std::string host, LLSD data, std::string msg
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";
-
+
gatherFiles();
LLSD post_data;
@@ -423,18 +445,24 @@ bool LLCrashLogger::sendCrashLog(std::string dump_dir)
std::ofstream out_file(report_file.c_str());
LLSDSerialize::toPrettyXML(post_data, out_file);
+ out_file.flush();
out_file.close();
bool sent = false;
//*TODO: Translate
if(mCrashHost != "")
- {
+ {
+ std::string msg = "Using derived crash server... ";
+ msg = msg+mCrashHost.c_str();
+ updateApplication(msg.c_str());
+
sent = runCrashLogPost(mCrashHost, post_data, std::string("Sending to server"), 3, 5);
}
if(!sent)
{
+ updateApplication("Using alternate (default) server...");
sent = runCrashLogPost(mAltCrashHost, post_data, std::string("Sending to alternate server"), 3, 5);
}
@@ -446,65 +474,22 @@ bool LLCrashLogger::sendCrashLog(std::string dump_dir)
bool LLCrashLogger::sendCrashLogs()
{
- //pertinent code from below moved into a subroutine.
- LLSD locks = mKeyMaster.getProcessList();
- LLSD newlocks = LLSD::emptyArray();
-
LLSD opts = getOptionData(PRIORITY_COMMAND_LINE);
LLSD rec;
- if ( opts.has("pid") && opts.has("dumpdir") && opts.has("procname") )
+ if ( opts.has("dumpdir") )
{
rec["pid"]=opts["pid"];
rec["dumpdir"]=opts["dumpdir"];
rec["procname"]=opts["procname"];
}
-
- if (locks.isArray())
+ else
{
- for (LLSD::array_iterator lock=locks.beginArray();
- lock !=locks.endArray();
- ++lock)
- {
- if ( (*lock).has("pid") && (*lock).has("dumpdir") && (*lock).has("procname") )
- {
- if ( mKeyMaster.isProcessAlive( (*lock)["pid"].asInteger(), (*lock)["procname"].asString() ) )
- {
- newlocks.append(*lock);
- }
- else
- {
- //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.
- if (!sendCrashLog((*lock)["dumpdir"].asString()))
- {
- newlocks.append(*lock); //Failed to send log so don't delete it.
- }
- else
- {
- //mCrashInfo["DebugLog"].erase("MinidumpPath");
-
- mKeyMaster.cleanupProcess((*lock)["dumpdir"].asString());
- }
- }
- }
- }
- else
- {
- LL_WARNS() << "Discarding corrupted entry from lock table." << LL_ENDL;
- }
- }
- }
+ return false;
+ }
+
+ return sendCrashLog(rec["dumpdir"].asString());
- if (rec)
- {
- newlocks.append(rec);
- }
-
- mKeyMaster.putProcessList(newlocks);
return true;
}
@@ -540,25 +525,7 @@ bool LLCrashLogger::init()
// 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.
- // 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;
-#if LL_WINDOWS
- Sleep(1000);
-#else
- sleep(1);
-#endif
- locked = mKeyMaster.checkMaster();
- }
-
- if (!locked)
- {
- LL_WARNS("CRASHREPORT") << "Unable to get master lock. Another crash reporter may be hung." << LL_ENDL;
- return false;
- }
+ LL_INFOS() << "Crash reporter file rotation complete." << LL_ENDL;
mCrashSettings.declareS32("CrashSubmitBehavior", CRASH_BEHAVIOR_ALWAYS_SEND,
"Controls behavior when viewer crashes "
diff --git a/indra/llcrashlogger/llcrashlogger.h b/indra/llcrashlogger/llcrashlogger.h
index a06bf1d6ac..b8a007f2be 100755
--- a/indra/llcrashlogger/llcrashlogger.h
+++ b/indra/llcrashlogger/llcrashlogger.h
@@ -46,7 +46,7 @@ public:
LLCrashLogger();
virtual ~LLCrashLogger();
S32 loadCrashBehaviorSetting();
- bool readDebugFromXML(LLSD& dest, const std::string& filename );
+ bool readFromXML(LLSD& dest, const std::string& filename );
void gatherFiles();
void mergeLogs( LLSD src_sd );
diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp
index 351009814d..ed64ebdb8c 100755
--- a/indra/mac_crash_logger/llcrashloggermac.cpp
+++ b/indra/mac_crash_logger/llcrashloggermac.cpp
@@ -66,6 +66,7 @@ void LLCrashLoggerMac::gatherPlatformSpecificFiles()
bool LLCrashLoggerMac::mainLoop()
{
+
if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND)
{
gSendReport = true;
@@ -82,6 +83,8 @@ bool LLCrashLoggerMac::mainLoop()
setUserText(gUserNotes);
sendCrashLogs();
}
+
+ LL_INFOS() << "Sending of logs complete" << LL_ENDL;
return true;
}
diff --git a/indra/mac_crash_logger/mac_crash_logger.cpp b/indra/mac_crash_logger/mac_crash_logger.cpp
index d6b913829e..72f4ede999 100755
--- a/indra/mac_crash_logger/mac_crash_logger.cpp
+++ b/indra/mac_crash_logger/mac_crash_logger.cpp
@@ -39,16 +39,17 @@ int main(int argc, char **argv)
LLSD options = LLApp::instance()->getOptionData(
LLApp::PRIORITY_COMMAND_LINE);
- if (!(options.has("pid") && options.has("dumpdir")))
- {
- llwarns << "Insufficient parameters to crash report." << llendl;
- }
-
if (! app.init())
{
LL_WARNS() << "Unable to initialize application." << LL_ENDL;
return 1;
}
+
+ if (!(options.has("pid") && options.has("dumpdir")))
+ {
+ LL_WARNS() << "Insufficient parameters to crash report." << llendl;
+ }
+
if (app.getCrashBehavior() != CRASH_BEHAVIOR_ALWAYS_SEND)
{
// return NSApplicationMain(argc, (const char **)argv);
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 09227806fd..ca219fda59 100755
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -83,10 +83,6 @@ static void exceptionTerminateHandler()
bool initViewer()
{
-#if LL_SOLARIS && defined(__sparc)
- asm ("ta\t6"); // NOTE: Make sure memory alignment is enforced on SPARC
-#endif
-
// Set the working dir to <bundle>/Contents/Resources
if (chdir(gDirUtilp->getAppRODataDir().c_str()) == -1)
{
@@ -301,6 +297,7 @@ void LLAppViewerMacOSX::initCrashReporting(bool reportFreeze)
std::string appname = gDirUtilp->getExecutableFilename();
std::string str[] = { "-pid", pid_str.str(), "-dumpdir", logdir, "-procname", appname.c_str() };
std::vector< std::string > args( str, str + ( sizeof ( str ) / sizeof ( std::string ) ) );
+ LL_WARNS() << "about to launch mac-crash-logger" << pid_str << " " << logdir << " " << appname << LL_ENDL;
launchApplication(&command_str, &args);
}