diff options
-rw-r--r-- | lib/Plugins/CCpp.conf | 3 | ||||
-rw-r--r-- | lib/Plugins/CCpp.cpp | 16 | ||||
-rw-r--r-- | lib/Plugins/CCpp.h | 1 | ||||
-rw-r--r-- | src/Daemon/MiddleWare.cpp | 16 |
4 files changed, 32 insertions, 4 deletions
diff --git a/lib/Plugins/CCpp.conf b/lib/Plugins/CCpp.conf index a18d56a3..82125813 100644 --- a/lib/Plugins/CCpp.conf +++ b/lib/Plugins/CCpp.conf @@ -12,6 +12,9 @@ SaveBinaryImage = no # Generate backtrace Backtrace = yes +# Generate backtrace for remote crashes +BacktraceRemotes = no + # Generate memory map too (IGNORED FOR NOW) MemoryMap = no diff --git a/lib/Plugins/CCpp.cpp b/lib/Plugins/CCpp.cpp index 0fc229d3..2a329530 100644 --- a/lib/Plugins/CCpp.cpp +++ b/lib/Plugins/CCpp.cpp @@ -50,6 +50,7 @@ crash at the same time? This value has been recommended by nhorman CAnalyzerCCpp::CAnalyzerCCpp() : m_bBacktrace(true), + m_bBacktraceRemotes(false), m_bMemoryMap(false), m_bInstallDebugInfo(true), m_nDebugInfoCacheMB(4000) @@ -700,6 +701,16 @@ void CAnalyzerCCpp::CreateReport(const char *pDebugDumpDir, int force) CDebugDump dd; dd.Open(pDebugDumpDir); + /* Skip remote crashes. */ + if (dd.Exist(FILENAME_REMOTE)) + { + std::string remote_str; + dd.LoadText(FILENAME_REMOTE, remote_str); + bool remote = (remote_str.find('1') != std::string::npos); + if (remote && !m_bBacktraceRemotes) + return; + } + if (!m_bBacktrace) return; @@ -985,6 +996,11 @@ void CAnalyzerCCpp::SetSettings(const map_plugin_settings_t& pSettings) { m_bBacktrace = string_to_bool(it->second.c_str()); } + it = pSettings.find("BacktraceRemotes"); + if (it != end) + { + m_bBacktraceRemotes = string_to_bool(it->second.c_str()); + } it = pSettings.find("MemoryMap"); if (it != end) { diff --git a/lib/Plugins/CCpp.h b/lib/Plugins/CCpp.h index afdc2c6e..ce6ba7a5 100644 --- a/lib/Plugins/CCpp.h +++ b/lib/Plugins/CCpp.h @@ -30,6 +30,7 @@ class CAnalyzerCCpp : public CAnalyzer { private: bool m_bBacktrace; + bool m_bBacktraceRemotes; bool m_bMemoryMap; bool m_bInstallDebugInfo; unsigned m_nDebugInfoCacheMB; diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index 57b29677..8b3e7e39 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -659,6 +659,7 @@ static bool is_path_blacklisted(const char *path) static mw_result_t SavePackageDescriptionToDebugDump( const char *pExecutable, const char *cmdline, + bool remote, const char *pDebugDumpDir) { std::string package; @@ -681,7 +682,7 @@ static mw_result_t SavePackageDescriptionToDebugDump( char *rpm_pkg = GetPackage(pExecutable); if (rpm_pkg == NULL) { - if (g_settings_bProcessUnpackaged) + if (g_settings_bProcessUnpackaged || remote) { VERB2 log("Crash in unpackaged executable '%s', proceeding without packaging information", pExecutable); try @@ -750,7 +751,7 @@ static mw_result_t SavePackageDescriptionToDebugDump( free(script_name); } - if (!knownOrigin && !g_settings_bProcessUnpackaged) + if (!knownOrigin && !g_settings_bProcessUnpackaged && !remote) { log("Interpreter crashed, but no packaged script detected: '%s'", cmdline); return MW_PACKAGE_ERROR; @@ -767,7 +768,7 @@ static mw_result_t SavePackageDescriptionToDebugDump( log("Blacklisted package '%s'", packageName.c_str()); return MW_BLACKLISTED; } - if (g_settings_bOpenGPGCheck) + if (g_settings_bOpenGPGCheck && !remote) { if (!s_RPM.CheckFingerprint(packageName.c_str())) { @@ -965,6 +966,7 @@ mw_result_t SaveDebugDump(const char *pDebugDumpDir, std::string analyzer; std::string executable; std::string cmdline; + bool remote = false; try { CDebugDump dd; @@ -974,6 +976,12 @@ mw_result_t SaveDebugDump(const char *pDebugDumpDir, dd.LoadText(FILENAME_ANALYZER, analyzer); dd.LoadText(FILENAME_EXECUTABLE, executable); dd.LoadText(FILENAME_CMDLINE, cmdline); + if (dd.Exist(FILENAME_REMOTE)) + { + std:string remote_str; + dd.LoadText(FILENAME_REMOTE, remote_str); + remote = (remote_str.find('1') != std::string::npos); + } } catch (CABRTException& e) { @@ -998,7 +1006,7 @@ mw_result_t SaveDebugDump(const char *pDebugDumpDir, return MW_IN_DB; } - mw_result_t res = SavePackageDescriptionToDebugDump(executable.c_str(), cmdline.c_str(), pDebugDumpDir); + mw_result_t res = SavePackageDescriptionToDebugDump(executable.c_str(), cmdline.c_str(), remote, pDebugDumpDir); if (res != MW_OK) { return res; |