On Wed, 2010-03-03 at 14:29 +0200, Pekka Pietikainen wrote:
Abrt looks like a good start for an instrumentation framework for robustness
testing, but distro-provided packages aren't the only things that
people want to test.
Iteration #1 of a config option to store all crashes. The "add (none) as
package" is evil, but something else seems to require
the package field to exist before crashes end up in the database.
Bugzilla plugin (etc.) probably should be modified to ignore these crashes,
but lets figure out how these crashes should be identified first.
Good idea, I propose the following fuller version:
--
vda
diff -x '*.po' -d -urpN abrt.0/inc/CrashTypes.h abrt.1/inc/CrashTypes.h
--- abrt.0/inc/CrashTypes.h 2010-03-04 16:20:58.000000000 +0100
+++ abrt.1/inc/CrashTypes.h 2010-03-05 15:14:04.113517811 +0100
@@ -21,25 +21,28 @@
#include "abrt_types.h"
-// Filenames in dump directory
+// Filenames in dump directory:
+// filled by a hook:
+#define FILENAME_ANALYZER "analyzer"
+#define FILENAME_EXECUTABLE "executable"
+#define FILENAME_CMDLINE "cmdline"
+#define FILENAME_REASON "reason"
+#define FILENAME_COREDUMP "coredump"
+#define FILENAME_BACKTRACE "backtrace"
+#define FILENAME_MEMORYMAP "memorymap"
+#define FILENAME_KERNELOOPS "kerneloops"
+// filled by CDebugDump::Create() (which also fills CD_UID):
#define FILENAME_ARCHITECTURE "architecture"
#define FILENAME_KERNEL "kernel"
#define FILENAME_TIME "time"
+#define FILENAME_RELEASE "release" /* from /etc/redhat-release */
+// filled by <what?>
#define FILENAME_PACKAGE "package"
#define FILENAME_COMPONENT "component"
-#define FILENAME_DESCRIPTION "description"
-#define FILENAME_ANALYZER "analyzer"
-#define FILENAME_RELEASE "release"
-#define FILENAME_EXECUTABLE "executable"
-#define FILENAME_REASON "reason"
+#define FILENAME_DESCRIPTION "description" /* package descr (not crash descr) */
#define FILENAME_COMMENT "comment"
#define FILENAME_REPRODUCE "reproduce"
#define FILENAME_RATING "rating"
-#define FILENAME_CMDLINE "cmdline"
-#define FILENAME_COREDUMP "coredump"
-#define FILENAME_BACKTRACE "backtrace"
-#define FILENAME_MEMORYMAP "memorymap"
-#define FILENAME_KERNELOOPS "kerneloops"
// Apart from CD_UID, which is also stored as a file in dump directory,
// these items only exist in db. (CD_UID is also a file because
diff -x '*.po' -d -urpN abrt.0/lib/Plugins/Bugzilla.cpp abrt.1/lib/Plugins/Bugzilla.cpp
--- abrt.0/lib/Plugins/Bugzilla.cpp 2010-03-01 13:38:34.000000000 +0100
+++ abrt.1/lib/Plugins/Bugzilla.cpp 2010-03-05 16:56:04.914517808 +0100
@@ -391,8 +391,8 @@ xmlrpc_int32 ctx::new_bug(const map_cras
if (env.fault_occurred)
return -1;
- log("New bug id: %i", bug_id);
- update_client(_("New bug id: %i"), bug_id);
+ log("New bug id: %i", (int)bug_id);
+ update_client(_("New bug id: %i"), (int)bug_id);
return bug_id;
}
@@ -585,6 +585,11 @@ std::string CReporterBugzilla::Report(co
{
update_client(_("Creating new bug..."));
bug_id = bz_server.new_bug(pCrashData);
+ if (bug_id < 0)
+ {
+ throw_if_xml_fault_occurred(&bz_server.env);
+ throw CABRTException(EXCEP_PLUGIN, _("Bugzilla entry creation failed"));
+ }
int ret = bz_server.add_attachments(to_string(bug_id).c_str(), pCrashData);
if (ret == -1)
{
diff -x '*.po' -d -urpN abrt.0/lib/Plugins/KerneloopsScanner.cpp abrt.1/lib/Plugins/KerneloopsScanner.cpp
--- abrt.0/lib/Plugins/KerneloopsScanner.cpp 2010-02-24 11:44:15.000000000 +0100
+++ abrt.1/lib/Plugins/KerneloopsScanner.cpp 2010-03-05 14:43:30.530767961 +0100
@@ -121,9 +121,7 @@ void save_oops_to_debug_dump(const vecto
dd.SaveText(FILENAME_ANALYZER, "Kerneloops");
dd.SaveText(FILENAME_EXECUTABLE, "kernel");
dd.SaveText(FILENAME_KERNEL, first_line);
- dd.SaveText(FILENAME_PACKAGE, "not_applicable");
dd.SaveText(FILENAME_CMDLINE, "not_applicable");
- dd.SaveText(FILENAME_COMPONENT, "kernel");
dd.SaveText(FILENAME_KERNELOOPS, second_line);
}
catch (CABRTException& e)
diff -x '*.po' -d -urpN abrt.0/lib/Utils/DebugDump.cpp abrt.1/lib/Utils/DebugDump.cpp
--- abrt.0/lib/Utils/DebugDump.cpp 2010-03-04 16:20:58.000000000 +0100
+++ abrt.1/lib/Utils/DebugDump.cpp 2010-03-05 14:53:01.042517328 +0100
@@ -320,7 +320,23 @@ void CDebugDump::Create(const char *pDir
}
SaveText(CD_UID, to_string(uid).c_str());
- SaveKernelArchitectureRelease();
+
+ {
+ struct utsname buf;
+ if (uname(&buf) != 0)
+ {
+ perror_msg_and_die("uname");
+ }
+ SaveText(FILENAME_KERNEL, buf.release);
+ SaveText(FILENAME_ARCHITECTURE, buf.machine);
+ std::string release;
+ LoadTextFile("/etc/redhat-release", release);
+ const char *release_ptr = release.c_str();
+ unsigned len_1st_str = strchrnul(release_ptr, '\n') - release_ptr;
+ release.erase(len_1st_str); /* usually simply removes trailing '\n' */
+ SaveText(FILENAME_RELEASE, release.c_str());
+ }
+
time_t t = time(NULL);
SaveText(FILENAME_TIME, to_string(t).c_str());
}
@@ -374,22 +390,6 @@ void CDebugDump::Close()
m_bOpened = false;
}
-void CDebugDump::SaveKernelArchitectureRelease()
-{
- struct utsname buf;
- if (uname(&buf) == 0)
- {
- SaveText(FILENAME_KERNEL, buf.release);
- SaveText(FILENAME_ARCHITECTURE, buf.machine);
- }
- std::string release;
- LoadTextFile("/etc/redhat-release", release);
- const char *release_ptr = release.c_str();
- unsigned len_1st_str = strchrnul(release_ptr, '\n') - release_ptr;
- release.erase(len_1st_str); /* usually simply removes trailing '\n' */
- SaveText(FILENAME_RELEASE, release.c_str());
-}
-
static void LoadTextFile(const char *pPath, std::string& pData)
{
FILE *fp = fopen(pPath, "r");
diff -x '*.po' -d -urpN abrt.0/lib/Utils/DebugDump.h abrt.1/lib/Utils/DebugDump.h
--- abrt.0/lib/Utils/DebugDump.h 2010-02-07 23:11:00.000000000 +0100
+++ abrt.1/lib/Utils/DebugDump.h 2010-03-05 14:46:53.089517955 +0100
@@ -34,8 +34,6 @@ class CDebugDump
uid_t m_uid;
gid_t m_gid;
- void SaveKernelArchitectureRelease();
-
void Lock();
void UnLock();
diff -x '*.po' -d -urpN abrt.0/src/Applet/Applet.cpp abrt.1/src/Applet/Applet.cpp
--- abrt.0/src/Applet/Applet.cpp 2010-02-07 23:11:00.000000000 +0100
+++ abrt.1/src/Applet/Applet.cpp 2010-03-05 15:59:38.786769015 +0100
@@ -45,8 +45,8 @@ static void Crash(DBusMessage* signal)
int r;
DBusMessageIter in_iter;
dbus_message_iter_init(signal, &in_iter);
- const char* progname;
- r = load_val(&in_iter, progname);
+ const char* package_name;
+ r = load_val(&in_iter, package_name);
/* Optional 2nd param: uid */
const char* uid_str = NULL;
if (r == ABRT_DBUS_MORE_FIELDS)
@@ -75,10 +75,12 @@ static void Crash(DBusMessage* signal)
}
const char* message = _("A crash in package %s has been detected");
- //applet->AddEvent(uid, progname);
- applet->SetIconTooltip(message, progname);
+ if (package_name[0] == '\0')
+ message = _("A crash has been detected");
+ //applet->AddEvent(uid, package_name);
+ applet->SetIconTooltip(message, package_name);
applet->ShowIcon();
- applet->CrashNotify(message, progname);
+ applet->CrashNotify(message, package_name);
}
static void QuotaExceed(DBusMessage* signal)
diff -x '*.po' -d -urpN abrt.0/src/Daemon/abrt.conf abrt.1/src/Daemon/abrt.conf
--- abrt.0/src/Daemon/abrt.conf 2010-03-04 16:20:58.000000000 +0100
+++ abrt.1/src/Daemon/abrt.conf 2010-03-05 15:51:03.728768257 +0100
@@ -6,6 +6,8 @@
OpenGPGCheck = yes
# Blacklisted packages
BlackList = nspluginwrapper, valgrind, strace, avant-window-navigator
+# Process crashes in executables which do not belong to any package?
+ProcessUnpackaged = no
# Which database plugin to use
Database = SQLite3
# Max size for crash storage [MiB]
diff -x '*.po' -d -urpN abrt.0/src/Daemon/CommLayerServerDBus.cpp abrt.1/src/Daemon/CommLayerServerDBus.cpp
--- abrt.0/src/Daemon/CommLayerServerDBus.cpp 2010-03-04 16:20:58.000000000 +0100
+++ abrt.1/src/Daemon/CommLayerServerDBus.cpp 2010-03-05 15:55:07.586767792 +0100
@@ -64,23 +64,23 @@ static void send_flush_and_unref(DBusMes
}
/* Notify the clients (UI) about a new crash */
-void CCommLayerServerDBus::Crash(const char *progname, const char *uid_str)
+void CCommLayerServerDBus::Crash(const char *package_name, const char *uid_str)
{
DBusMessage* msg = new_signal_msg("Crash");
if (uid_str)
{
dbus_message_append_args(msg,
- DBUS_TYPE_STRING, &progname,
+ DBUS_TYPE_STRING, &package_name,
DBUS_TYPE_STRING, &uid_str,
DBUS_TYPE_INVALID);
- VERB2 log("Sending signal Crash('%s','%s')", progname, uid_str);
+ VERB2 log("Sending signal Crash('%s','%s')", package_name, uid_str);
}
else
{
dbus_message_append_args(msg,
- DBUS_TYPE_STRING, &progname,
+ DBUS_TYPE_STRING, &package_name,
DBUS_TYPE_INVALID);
- VERB2 log("Sending signal Crash('%s')", progname);
+ VERB2 log("Sending signal Crash('%s')", package_name);
}
send_flush_and_unref(msg);
}
diff -x '*.po' -d -urpN abrt.0/src/Daemon/CommLayerServerDBus.h abrt.1/src/Daemon/CommLayerServerDBus.h
--- abrt.0/src/Daemon/CommLayerServerDBus.h 2010-03-04 16:20:58.000000000 +0100
+++ abrt.1/src/Daemon/CommLayerServerDBus.h 2010-03-05 15:54:53.905768777 +0100
@@ -29,7 +29,7 @@ class CCommLayerServerDBus
virtual ~CCommLayerServerDBus();
/* DBus signal senders */
- virtual void Crash(const char *progname, const char *uid_str);
+ virtual void Crash(const char *package_name, const char *uid_str);
virtual void JobDone(const char* peer);
virtual void QuotaExceed(const char* str);
diff -x '*.po' -d -urpN abrt.0/src/Daemon/CommLayerServer.h abrt.1/src/Daemon/CommLayerServer.h
--- abrt.0/src/Daemon/CommLayerServer.h 2010-03-04 16:20:58.000000000 +0100
+++ abrt.1/src/Daemon/CommLayerServer.h 2010-03-05 15:55:24.881518246 +0100
@@ -30,7 +30,7 @@ class CCommLayerServer {
virtual ~CCommLayerServer();
/* just stubs to be called when not implemented in specific comm layer */
- virtual void Crash(const char *progname, const char *uid_str) {}
+ virtual void Crash(const char *package_name, const char *uid_str) {}
virtual void JobDone(const char* peer) = 0;
virtual void QuotaExceed(const char* str) {}
diff -x '*.po' -d -urpN abrt.0/src/Daemon/MiddleWare.cpp abrt.1/src/Daemon/MiddleWare.cpp
--- abrt.0/src/Daemon/MiddleWare.cpp 2010-03-04 16:20:58.000000000 +0100
+++ abrt.1/src/Daemon/MiddleWare.cpp 2010-03-05 16:12:39.331518910 +0100
@@ -654,19 +654,41 @@ static mw_result_t SavePackageDescriptio
{
std::string package;
std::string packageName;
+ std::string component;
std::string scriptName; /* only if "interpreter /path/to/script" */
if (strcmp(pExecutable, "kernel") == 0)
{
- packageName = package = "kernel";
+ component = packageName = package = "kernel";
}
else
{
char *rpm_pkg = GetPackage(pExecutable);
if (rpm_pkg == NULL)
{
- log("Executable '%s' doesn't belong to any package", pExecutable);
- return MW_PACKAGE_ERROR;
+ if (g_settings_bProcessUnpackaged)
+ {
+ VERB2 log("Crash in unpackaged executable '%s', proceeding without packaging information", pExecutable);
+ try
+ {
+ CDebugDump dd;
+ dd.Open(pDebugDumpDir);
+ dd.SaveText(FILENAME_PACKAGE, "");
+ dd.SaveText(FILENAME_COMPONENT, "");
+ dd.SaveText(FILENAME_DESCRIPTION, "Crashed executable does not belong to any installed package");
+ return MW_OK;
+ }
+ catch (CABRTException& e)
+ {
+ error_msg("%s", e.what());
+ return MW_ERROR;
+ }
+ }
+ else
+ {
+ log("Executable '%s' doesn't belong to any package", pExecutable);
+ return MW_PACKAGE_ERROR;
+ }
}
/* Check well-known interpreter names */
@@ -738,19 +760,17 @@ static mw_result_t SavePackageDescriptio
}
*/
}
+ component = GetComponent(pExecutable);
}
std::string description = GetDescription(packageName.c_str());
- std::string component = GetComponent(pExecutable);
try
{
CDebugDump dd;
dd.Open(pDebugDumpDir);
dd.SaveText(FILENAME_PACKAGE, package.c_str());
dd.SaveText(FILENAME_DESCRIPTION, description.c_str());
- /* For oopses, pExecutable == "kernel" gives "" here. Don't write it */
- if (component.size() != 0)
- dd.SaveText(FILENAME_COMPONENT, component.c_str());
+ dd.SaveText(FILENAME_COMPONENT, component.c_str());
}
catch (CABRTException& e)
{
diff -x '*.po' -d -urpN abrt.0/src/Daemon/Settings.cpp abrt.1/src/Daemon/Settings.cpp
--- abrt.0/src/Daemon/Settings.cpp 2010-02-12 17:53:07.000000000 +0100
+++ abrt.1/src/Daemon/Settings.cpp 2010-03-05 14:20:59.750517799 +0100
@@ -56,6 +56,8 @@ set_string_t g_settings_setOpenGPGPubli
set_string_t g_settings_mapBlackList;
std::string g_settings_sDatabase;
unsigned int g_settings_nMaxCrashReportsSize = 1000;
+bool g_settings_bProcessUnpackaged = false;
+
/* one line: "ActionsAndReporters = aa_first,bb_first(bb_second),cc_first" */
vector_pair_string_string_t g_settings_vectorActionsAndReporters;
/* [ AnalyzerActionsAndReporters ] */
@@ -188,6 +190,11 @@ static void ParseCommon()
{
g_settings_vectorActionsAndReporters = ParseListWithArgs(it->second.c_str());
}
+ it = s_mapSectionCommon.find("ProcessUnpackaged");
+ if (it != end)
+ {
+ g_settings_bProcessUnpackaged = string_to_bool(it->second.c_str());
+ }
}
static void ParseCron()
diff -x '*.po' -d -urpN abrt.0/src/Daemon/Settings.h abrt.1/src/Daemon/Settings.h
--- abrt.0/src/Daemon/Settings.h 2010-02-07 23:11:00.000000000 +0100
+++ abrt.1/src/Daemon/Settings.h 2010-03-05 14:20:59.750517799 +0100
@@ -29,6 +29,7 @@ extern set_string_t g_settings_setOpenG
extern set_string_t g_settings_mapBlackList;
extern unsigned int g_settings_nMaxCrashReportsSize;
extern bool g_settings_bOpenGPGCheck;
+extern bool g_settings_bProcessUnpackaged;
extern std::string g_settings_sDatabase;
extern map_cron_t g_settings_mapCron;
extern vector_pair_string_string_t g_settings_vectorActionsAndReporters;
diff -x '*.po' -d -urpN abrt.0/src/Gui/CCDBusBackend.py abrt.1/src/Gui/CCDBusBackend.py
--- abrt.0/src/Gui/CCDBusBackend.py 2010-03-04 16:20:58.000000000 +0100
+++ abrt.1/src/Gui/CCDBusBackend.py 2010-03-05 16:12:17.490521509 +0100
@@ -170,6 +170,7 @@ class DBusManager(gobject.GObject):
if dump:
self.emit("analyze-complete", dump)
else:
+ # FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
self.emit("abrt-error", _("Daemon didn't return valid report info\nDebuginfo is missing?"))
def report_done(self, result):