summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--inc/CrashTypes.h19
-rw-r--r--lib/Plugins/FileTransfer.cpp6
-rw-r--r--lib/Plugins/TicketUploader.h1
-rw-r--r--lib/Utils/CrashTypes.cpp47
-rw-r--r--src/Daemon/MiddleWare.cpp81
-rw-r--r--src/Gui/CCMainWindow.py10
-rw-r--r--src/Gui/PluginList.py2
7 files changed, 88 insertions, 78 deletions
diff --git a/inc/CrashTypes.h b/inc/CrashTypes.h
index 834a849e..b14413d5 100644
--- a/inc/CrashTypes.h
+++ b/inc/CrashTypes.h
@@ -53,7 +53,7 @@
#define CD_MESSAGE "Message"
-// crash data is a map of 3-element vectors of strings: type, editable, content
+// Crash data is a map of 3-element vectors of strings: type, editable, content
#define CD_TYPE 0
#define CD_EDITABLE 1
#define CD_CONTENT 2
@@ -64,7 +64,7 @@
#define CD_SYS "s"
#define CD_BIN "b"
#define CD_TXT "t"
-/* Text bigger than this usually is attached, not added inline */
+// Text bigger than this usually is attached, not added inline
#define CD_TEXT_ATT_SIZE (2*1024)
#define CD_ISEDITABLE "y"
@@ -73,26 +73,25 @@
extern const char *const must_have_files[];
-
bool is_editable_file(const char *file_name);
// <key, data>
typedef map_vector_string_t map_crash_data_t;
-
typedef std::vector<map_crash_data_t> vector_map_crash_data_t;
-void add_to_crash_data(map_crash_data_t& pCrashData,
- const char *pItem,
- const char *pContent);
-
void add_to_crash_data_ext(map_crash_data_t& pCrashData,
const char *pItem,
const char *pType,
const char *pEditable,
const char *pContent);
+// Uses type:CD_TXT, editable:CD_ISNOTEDITABLE
+void add_to_crash_data(map_crash_data_t& pCrashData,
+ const char *pItem,
+ const char *pContent);
-const std::string& get_crash_data_item_content(const map_crash_data_t& crash_data,
- const char *key);
+const char *get_crash_data_item_content_or_NULL(const map_crash_data_t& crash_data, const char *key);
+// Aborts if key is not found:
+const std::string& get_crash_data_item_content(const map_crash_data_t& crash_data, const char *key);
void log_map_crash_data(const map_crash_data_t& data, const char *name);
diff --git a/lib/Plugins/FileTransfer.cpp b/lib/Plugins/FileTransfer.cpp
index fff6f2dd..e28fbbee 100644
--- a/lib/Plugins/FileTransfer.cpp
+++ b/lib/Plugins/FileTransfer.cpp
@@ -25,12 +25,6 @@
#include <iostream>
#include <sstream>
#include <fstream>
-//#include <stdio.h>
-//#include <string.h>
-//#include <dirent.h>
-//#include <sys/types.h>
-//#include <sys/stat.h>
-//#include <fcntl.h>
#include <zip.h>
#include <libtar.h>
#include <bzlib.h>
diff --git a/lib/Plugins/TicketUploader.h b/lib/Plugins/TicketUploader.h
index fcc59f06..7a371a3a 100644
--- a/lib/Plugins/TicketUploader.h
+++ b/lib/Plugins/TicketUploader.h
@@ -27,7 +27,6 @@
#include "Plugin.h"
#include "Reporter.h"
-//#include "CrashTypes.h"
class CTicketUploader : public CReporter
{
diff --git a/lib/Utils/CrashTypes.cpp b/lib/Utils/CrashTypes.cpp
index 552c3666..4fc93337 100644
--- a/lib/Utils/CrashTypes.cpp
+++ b/lib/Utils/CrashTypes.cpp
@@ -62,9 +62,10 @@ void add_to_crash_data_ext(map_crash_data_t& pCrashData,
{
map_crash_data_t::iterator it = pCrashData.find(pItem);
if (it == pCrashData.end()) {
- pCrashData[pItem].push_back(pType);
- pCrashData[pItem].push_back(pEditable);
- pCrashData[pItem].push_back(pContent);
+ vector_string_t& v = pCrashData[pItem]; /* create empty vector */
+ v.push_back(pType);
+ v.push_back(pEditable);
+ v.push_back(pContent);
return;
}
vector_string_t& v = it->second;
@@ -82,28 +83,50 @@ void add_to_crash_data(map_crash_data_t& pCrashData,
add_to_crash_data_ext(pCrashData, pItem, CD_TXT, CD_ISNOTEDITABLE, pContent);
}
-const std::string& get_crash_data_item_content(const map_crash_data_t& crash_data, const char *key)
+static const std::string* helper_get_crash_data_item_content(const map_crash_data_t& crash_data, const char *key)
{
map_crash_data_t::const_iterator it = crash_data.find(key);
if (it == crash_data.end()) {
- error_msg_and_die("Error accessing crash data: no ['%s']", key);
+ return NULL;
}
if (it->second.size() <= CD_CONTENT) {
+ return NULL;
+ }
+ return &it->second[CD_CONTENT];
+}
+
+const std::string& get_crash_data_item_content(const map_crash_data_t& crash_data, const char *key)
+{
+ const std::string* sp = helper_get_crash_data_item_content(crash_data, key);
+ if (sp == NULL) {
+ if (crash_data.find(key) == crash_data.end())
+ error_msg_and_die("Error accessing crash data: no ['%s']", key);
error_msg_and_die("Error accessing crash data: no ['%s'][%d]", key, CD_CONTENT);
}
- return it->second[CD_CONTENT];
+ return *sp;
+}
+
+const char *get_crash_data_item_content_or_NULL(const map_crash_data_t& crash_data, const char *key)
+{
+ const std::string* sp = helper_get_crash_data_item_content(crash_data, key);
+ if (!sp) {
+ return NULL;
+ }
+ return sp->c_str();
}
void log_map_crash_data(const map_crash_data_t& data, const char *name)
{
- map_crash_data_t::const_iterator itc = data.begin();
- while (itc != data.end())
+ map_crash_data_t::const_iterator it = data.begin();
+ while (it != data.end())
{
+ ssize_t sz = it->second.size();
log("%s[%s]:%s/%s/'%.20s'",
- name, itc->first.c_str(),
- itc->second[0].c_str(), itc->second[1].c_str(),
- itc->second[2].c_str()
+ name, it->first.c_str(),
+ sz > 0 ? it->second[0].c_str() : "<NO [0]>",
+ sz > 1 ? it->second[1].c_str() : "<NO [1]>",
+ sz > 2 ? it->second[2].c_str() : "<NO [2]>"
);
- itc++;
+ it++;
}
}
diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp
index ecf3c13a..9abb737b 100644
--- a/src/Daemon/MiddleWare.cpp
+++ b/src/Daemon/MiddleWare.cpp
@@ -259,36 +259,31 @@ mw_result_t CreateCrashReport(const char *pUUID,
mw_result_t r = MW_OK;
try
{
- CDebugDump dd;
- std::string analyzer;
- std::string comment;
- std::string reproduce = "1.\n2.\n3.\n";
-
- VERB3 log(" LoadText(FILENAME_ANALYZER,'%s')", row.m_sDebugDumpDir.c_str());
- dd.Open(row.m_sDebugDumpDir.c_str());
- dd.LoadText(FILENAME_ANALYZER, analyzer);
- if (dd.Exist(FILENAME_COMMENT))
{
- dd.LoadText(FILENAME_COMMENT, comment);
+ CDebugDump dd;
+ dd.Open(row.m_sDebugDumpDir.c_str());
+ load_crash_data_from_debug_dump(dd, pCrashData);
}
- if (dd.Exist(FILENAME_REPRODUCE))
- {
- dd.LoadText(FILENAME_REPRODUCE, reproduce);
- }
- load_crash_data_from_debug_dump(dd, pCrashData);
- dd.Close();
- VERB3 log(" CreateReport('%s')", analyzer.c_str());
+ std::string analyzer = get_crash_data_item_content(pCrashData, FILENAME_ANALYZER);
+
+ // TODO: explain what run_analyser_CreateReport and RunAnalyzerActions are expected to do.
+ // Do they potentially add more files to dump dir?
+ // Why we calculate dup_hash after run_analyser_CreateReport but before RunAnalyzerActions?
+ // Why do we reload dump dir's data via DebugDumpToCrashReport?
+
+ VERB3 log(" run_analyser_CreateReport('%s')", analyzer.c_str());
run_analyser_CreateReport(analyzer.c_str(), row.m_sDebugDumpDir.c_str(), force);
- std::string gUUID = GetGlobalUUID(analyzer.c_str(), row.m_sDebugDumpDir.c_str());
- VERB3 log(" GetGlobalUUID:'%s'", gUUID.c_str());
+ std::string dup_hash = GetGlobalUUID(analyzer.c_str(), row.m_sDebugDumpDir.c_str());
+ VERB3 log(" DUPHASH:'%s'", dup_hash.c_str());
VERB3 log(" RunAnalyzerActions('%s','%s')", analyzer.c_str(), row.m_sDebugDumpDir.c_str());
RunAnalyzerActions(analyzer.c_str(), row.m_sDebugDumpDir.c_str());
+
DebugDumpToCrashReport(row.m_sDebugDumpDir.c_str(), pCrashData);
- add_to_crash_data_ext(pCrashData, CD_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, gUUID.c_str());
+ add_to_crash_data_ext(pCrashData, CD_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, dup_hash.c_str());
add_to_crash_data_ext(pCrashData, CD_UUID , CD_SYS, CD_ISNOTEDITABLE, pUUID);
}
catch (CABRTException& e)
@@ -373,54 +368,50 @@ report_status_t Report(const map_crash_data_t& client_report,
map_map_string_t& pSettings,
const char *pUID)
{
- map_crash_data_t::const_iterator itc_end = client_report.end();
-
// Get ID fields
- map_crash_data_t::const_iterator itc_UID = client_report.find(FILENAME_UID);
- map_crash_data_t::const_iterator itc_UUID = client_report.find(CD_UUID);
- if (itc_UID == itc_end /* || !exists itc_UID->second[CD_CONTENT] (TODO) */
- || itc_UUID == itc_end
- ) {
+ const char *UID = get_crash_data_item_content_or_NULL(client_report, FILENAME_UID);
+ const char *UUID = get_crash_data_item_content_or_NULL(client_report, CD_UUID);
+ if (!UID || !UUID) {
throw CABRTException(EXCEP_ERROR, "Report(): UID or UUID is missing in client's report data");
}
// Retrieve corresponding stored record
- std::string UID = itc_UID->second[CD_CONTENT];
- std::string UUID = itc_UUID->second[CD_CONTENT];
-
map_crash_data_t stored_report;
- mw_result_t r = FillCrashInfo(UUID.c_str(), UID.c_str(), stored_report);
+ mw_result_t r = FillCrashInfo(UUID, UID, stored_report);
if (r != MW_OK)
return report_status_t();
const std::string& pDumpDir = get_crash_data_item_content(stored_report, CD_DUMPDIR);
- // Save comment and "how to reproduce"
- map_crash_data_t::const_iterator itc_COMMENT = client_report.find(FILENAME_COMMENT);
- map_crash_data_t::const_iterator itc_REPRODUCE = client_report.find(FILENAME_REPRODUCE);
- if (itc_COMMENT != itc_end || itc_REPRODUCE != itc_end)
+ // Save comment, "how to reproduce", backtrace
+ const char *comment = get_crash_data_item_content_or_NULL(client_report, FILENAME_COMMENT);
+ const char *reproduce = get_crash_data_item_content_or_NULL(client_report, FILENAME_REPRODUCE);
+ const char *backtrace = get_crash_data_item_content_or_NULL(client_report, FILENAME_BACKTRACE);
+ if (comment || reproduce || backtrace)
{
CDebugDump dd;
dd.Open(pDumpDir.c_str());
- if (itc_COMMENT != itc_end && itc_COMMENT->second.size() > CD_CONTENT)
+ if (comment)
{
- const char *comment = itc_COMMENT->second[CD_CONTENT].c_str();
dd.SaveText(FILENAME_COMMENT, comment);
add_to_crash_data_ext(stored_report, FILENAME_COMMENT, CD_TXT, CD_ISEDITABLE, comment);
}
- if (itc_REPRODUCE != itc_end && itc_REPRODUCE->second.size() > CD_CONTENT)
+ if (reproduce)
{
- const char *reproduce = itc_REPRODUCE->second[CD_CONTENT].c_str();
dd.SaveText(FILENAME_REPRODUCE, reproduce);
add_to_crash_data_ext(stored_report, FILENAME_REPRODUCE, CD_TXT, CD_ISEDITABLE, reproduce);
}
+ if (backtrace)
+ {
+ dd.SaveText(FILENAME_BACKTRACE, backtrace);
+ add_to_crash_data_ext(stored_report, FILENAME_BACKTRACE, CD_TXT, CD_ISEDITABLE, backtrace);
+ }
}
- map_crash_data_t::const_iterator its_ANALYZER = stored_report.find(FILENAME_ANALYZER);
- std::string analyzer = its_ANALYZER->second[CD_CONTENT];
+ const std::string& analyzer = get_crash_data_item_content(stored_report, FILENAME_ANALYZER);
- std::string gUUID = GetGlobalUUID(analyzer.c_str(), pDumpDir.c_str());
- VERB3 log(" GetGlobalUUID:'%s'", gUUID.c_str());
- add_to_crash_data_ext(stored_report, CD_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, gUUID.c_str());
+ std::string dup_hash = GetGlobalUUID(analyzer.c_str(), pDumpDir.c_str());
+ VERB3 log(" DUPHASH:'%s'", dup_hash.c_str());
+ add_to_crash_data_ext(stored_report, CD_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, dup_hash.c_str());
// Run reporters
@@ -507,7 +498,7 @@ report_status_t Report(const map_crash_data_t& client_report,
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
database->Connect();
- database->SetReported(UUID.c_str(), UID.c_str(), message.c_str());
+ database->SetReported(UUID, UID, message.c_str());
database->DisConnect();
return ret;
diff --git a/src/Gui/CCMainWindow.py b/src/Gui/CCMainWindow.py
index 9dffa7a7..8222c17c 100644
--- a/src/Gui/CCMainWindow.py
+++ b/src/Gui/CCMainWindow.py
@@ -229,6 +229,7 @@ class MainWindow():
# this should work until we keep the row object in the last position
dump = dumpsListStore.get_value(dumpsListStore.get_iter(path[0]), dumpsListStore.get_n_columns()-1)
#move this to Dump class
+ lReported = self.wTree.get_widget("lReported")
if dump.isReported():
report_label_raw = _("This crash has been reported:\n")
report_label = _("<b>This crash has been reported:</b>\n")
@@ -244,10 +245,13 @@ class MainWindow():
report_label += "%s\n" % report_message
report_label_raw += "%s\n" % message_clean
log2("setting markup '%s'", report_label)
- self.wTree.get_widget("lReported").set_text(report_label_raw)
- self.wTree.get_widget("lReported").set_markup(report_label)
+ lReported.set_text(report_label_raw)
+ # Sometimes (!) set_markup() fails with
+ # "GtkWarning: Failed to set text from markup due to error parsing markup: Unknown tag 'a'"
+ # If it does, then set_text() above acts as a fallback
+ lReported.set_markup(report_label)
else:
- self.wTree.get_widget("lReported").set_markup(_("<b>Not reported!</b>"))
+ lReported.set_markup(_("<b>Not reported!</b>"))
def on_bDelete_clicked(self, button, treeview):
dumpsListStore, path = self.dlist.get_selection().get_selected_rows()
diff --git a/src/Gui/PluginList.py b/src/Gui/PluginList.py
index 78e58298..82759ae3 100644
--- a/src/Gui/PluginList.py
+++ b/src/Gui/PluginList.py
@@ -43,7 +43,7 @@ class PluginInfoList(list):
for plugin in self.getReporterPlugins():
reporters_settings[str(plugin)] = plugin.Settings
return reporters_settings
-
+
__PFList = None
__PFList_dbmanager = None