[LIBREPORT PATCHv3 1/2] Update satyr support, drop btparser compatibility
Martin Milata
mmilata at redhat.com
Tue Jul 9 16:26:55 UTC 2013
Related to abrt/satyr#88.
Signed-off-by: Martin Milata <mmilata at redhat.com>
---
configure.ac | 18 +--
libreport-web.pc.in | 2 +-
src/lib/json.c | 288 +---------------------------------------
src/plugins/reporter-bugzilla.c | 75 +++--------
4 files changed, 27 insertions(+), 356 deletions(-)
diff --git a/configure.ac b/configure.ac
index 671d6a4..da7f480 100644
--- a/configure.ac
+++ b/configure.ac
@@ -145,11 +145,6 @@ PYTHON_LIBS=`python-config --libs 2> /dev/null`
AC_SUBST(PYTHON_CFLAGS)
AC_SUBST(PYTHON_LIBS)
-AC_ARG_WITH([satyr],
- AS_HELP_STRING([--with-satyr],
- [use satyr instead of btparser (default is no)]),
- [], [with_satyr=no])
-
PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.21])
PKG_CHECK_MODULES([DBUS], [dbus-1])
PKG_CHECK_MODULES([LIBXML], [libxml-2.0])
@@ -158,18 +153,7 @@ PKG_CHECK_MODULES([CURL], [libcurl])
PKG_CHECK_MODULES([PROXY], [libproxy-1.0], [
AC_DEFINE([HAVE_PROXY], [1], [Use libproxy])
], [:])
-
-[if test "$with_satyr" = "yes"]
-[then]
- PKG_CHECK_MODULES([SATYR], [satyr])
- AC_DEFINE([USE_SATYR], [1], [Use satyr instead of btparser])
- SATYR_PKG="satyr"
-[else]
- PKG_CHECK_MODULES([SATYR], [btparser])
- SATYR_PKG="btparser"
-[fi]
-AC_SUBST(SATYR_PKG)
-AM_CONDITIONAL([USE_SATYR], [test "$with_satyr" = "yes"])
+PKG_CHECK_MODULES([SATYR], [satyr])
AC_ARG_WITH(newt,
AS_HELP_STRING([--with-newt],[use newt (default is YES)]),
diff --git a/libreport-web.pc.in b/libreport-web.pc.in
index ec4ab8e..288e613 100644
--- a/libreport-web.pc.in
+++ b/libreport-web.pc.in
@@ -6,7 +6,7 @@ includedir=@includedir@
Name: libreport
Description: Library providing network API for libreport
Version: @VERSION@
-Requires: glib-2.0 libcurl libproxy-1.0 libxml-2.0 xmlrpc xmlrpc_client json @SATYR_PKG@ libreport
+Requires: glib-2.0 libcurl libproxy-1.0 libxml-2.0 xmlrpc xmlrpc_client json satyr libreport
Libs: -L${libdir} -lreport-web
Cflags:
diff --git a/src/lib/json.c b/src/lib/json.c
index d5c6f2d..68348ad 100644
--- a/src/lib/json.c
+++ b/src/lib/json.c
@@ -19,6 +19,9 @@
#include <json/json.h>
+#include <satyr/abrt.h>
+#include <satyr/report.h>
+
#include "internal_libreport.h"
#include "ureport.h"
#include "libreport_curl.h"
@@ -34,11 +37,6 @@ static void ureport_add_str(struct json_object *ur, const char *key,
json_object_object_add(ur, key, jstring);
}
-#if USE_SATYR
-
-#include <satyr/abrt.h>
-#include <satyr/report.h>
-
char *ureport_from_dump_dir(const char *dump_dir_path)
{
char *error_message;
@@ -54,286 +52,6 @@ char *ureport_from_dump_dir(const char *dump_dir_path)
return json_ureport;
}
-#else /* USE_SATYR */
-
-#include <btparser/thread.h>
-#include <btparser/core-backtrace.h>
-
-/* on success 1 returned, on error zero is returned and appropriate value
- * is returned as third argument. You should never read third argument when
- * function fails
- *
- * json-c library doesn't have any json_object_new_long,
- * thus we have to use only int
- */
-static int get_pd_int_item(problem_data_t *pd, const char *key, int *result)
-{
- if (!pd || !key)
- return 0;
-
- char *pd_item = problem_data_get_content_or_NULL(pd, key);
- if (!pd_item)
- {
- VERB1 log("warning: '%s' is not an item in problem directory", key);
- return 0;
- }
-
- errno = 0;
- char *e;
- long i = strtol(pd_item, &e, 10);
- if (errno || pd_item == e || *e != '\0' || (int) i != i)
- return 0;
-
- *result = i;
- return 1;
-}
-
-static void ureport_add_int(struct json_object *ur, const char *key, int i)
-{
- struct json_object *jint = json_object_new_int(i);
- if (!jint)
- die_out_of_memory();
-
- json_object_object_add(ur, key, jint);
-}
-
-static void ureport_add_os(struct json_object *ur, problem_data_t *pd)
-{
- char *name;
- char *version;
- map_string_t *osinfo = new_map_string();
- problem_data_get_osinfo(pd, osinfo);
- parse_osinfo_for_rhts(osinfo, &name, &version);
- free_map_string(osinfo);
-
- if (!name || !version)
- {
- free(name);
- free(version);
- return;
- }
-
- struct json_object *jobject = json_object_new_object();
- if (!jobject)
- die_out_of_memory();
-
- ureport_add_str(jobject, "name", name);
- ureport_add_str(jobject, "version", version);
-
- free(name);
- free(version);
-
- json_object_object_add(ur, "os", jobject);
-}
-
-static bool ureport_add_type(struct json_object *ur, problem_data_t *pd)
-{
- char *pd_item = problem_data_get_content_or_NULL(pd, FILENAME_ANALYZER);
- if (!pd_item)
- {
- error_msg(_("Missing problem element '%s'"), FILENAME_ANALYZER);
- return false;
- }
-
- if (strcmp(pd_item, "CCpp") == 0)
- ureport_add_str(ur, "type", "USERSPACE");
- else if (strcmp(pd_item, "Python") == 0)
- ureport_add_str(ur, "type", "PYTHON");
- else if (strcmp(pd_item, "Kerneloops") == 0 || strcmp(pd_item, "vmcore") == 0)
- ureport_add_str(ur, "type", "KERNELOOPS");
- else
- {
- error_msg(_("An unsupported value '%s' in problem element '%s'"), pd_item, FILENAME_ANALYZER);
- return false;
- }
-
- return true;
-}
-
-static void ureport_add_core_backtrace(struct json_object *ur, problem_data_t *pd)
-{
- char *pd_item = problem_data_get_content_or_NULL(pd, FILENAME_CORE_BACKTRACE);
- if (!pd_item)
- return;
-
- struct btp_thread *core_bt = btp_load_core_backtrace(pd_item);
- if (!core_bt)
- return;
-
- struct json_object *jarray = json_object_new_array();
- if (!jarray)
- die_out_of_memory();
-
- struct btp_frame *frame;
- unsigned frame_nr = 0;
- for (frame = core_bt->frames; frame; frame = frame->next)
- {
- struct frame_aux *aux = frame->user_data;
-
- struct json_object *item = json_object_new_object();
- if (!item)
- die_out_of_memory();
-
- if (aux->filename)
- ureport_add_str(item, "path", aux->filename);
-
- if (frame->function_name)
- ureport_add_str(item, "funcname", frame->function_name);
-
- if (aux->build_id)
- ureport_add_str(item, "buildid", aux->build_id);
-
- if (aux->fingerprint)
- ureport_add_str(item, "funchash", aux->fingerprint);
-
- /* always add offset - even offset 0 is valid */
- ureport_add_int(item, "offset", (uintmax_t)frame->address);
-
- ureport_add_int(item, "frame", frame_nr++);
- ureport_add_int(item, "thread", 0);
-
-
- json_object_array_add(jarray, item);
- }
-
- btp_thread_free(core_bt);
-
- json_object_object_add(ur, FILENAME_CORE_BACKTRACE, jarray);
-}
-static void ureport_add_item_str(struct json_object *ur, problem_data_t *pd,
- const char *key, const char *rename)
-{
- char *pd_item = problem_data_get_content_or_NULL(pd, key);
- if (!pd_item)
- return;
-
- ureport_add_str(ur, (rename) ?: key, pd_item);
-}
-
-static void ureport_add_item_int(struct json_object *ur, problem_data_t *pd,
- const char *key, const char *rename)
-{
- int nr;
- int stat = get_pd_int_item(pd, key, &nr);
- if (!stat)
- return;
-
- ureport_add_int(ur, (rename) ?: key, nr);
-}
-
-static void ureport_add_pkg(struct json_object *ur, problem_data_t *pd)
-{
- struct json_object *jobject = json_object_new_object();
- if (!jobject)
- die_out_of_memory();
-
- ureport_add_item_int(jobject, pd, FILENAME_PKG_EPOCH, "epoch");
- ureport_add_item_str(jobject, pd, FILENAME_PKG_NAME, "name");
- ureport_add_item_str(jobject, pd, FILENAME_PKG_VERSION, "version");
- ureport_add_item_str(jobject, pd, FILENAME_PKG_RELEASE, "release");
- ureport_add_item_str(jobject, pd, FILENAME_PKG_ARCH, "architecture");
-
- json_object_object_add(ur, "installed_package", jobject);
-}
-
-static void ureport_add_related_pkgs(struct json_object *ur, problem_data_t *pd)
-{
- // TODO: populate this field
- struct json_object *jobject = json_object_new_array();
- json_object_object_add(ur, "related_packages", jobject);
-}
-
-static void ureport_add_reporter(struct json_object *ur, const char *name, const char *version)
-{
- struct json_object *jobject = json_object_new_object();
- if (!jobject)
- die_out_of_memory();
-
- ureport_add_str(jobject, "name", name);
- ureport_add_str(jobject, "version", version);
-
- json_object_object_add(ur, "reporter", jobject);
-}
-
-static void ureport_add_oops(struct json_object *ur, problem_data_t *pd)
-{
- char *pd_item = problem_data_get_content_or_NULL(pd, FILENAME_ANALYZER);
- if (!pd_item)
- return;
-
- if (!strcmp(pd_item, "Kerneloops"))
- ureport_add_item_str(ur, pd, FILENAME_BACKTRACE, "oops");
-}
-
-char *new_json_ureport(problem_data_t *pd)
-{
- struct json_object *ureport = json_object_new_object();
- if (!ureport)
- die_out_of_memory();
-
- ureport_add_item_str(ureport, pd, "user_type", NULL);
- ureport_add_item_int(ureport, pd, "uptime", NULL);
-
- /* mandatory, but not in problem-dir
- *
- * ureport_add_item_int(ureport, pd, "crash_thread", NULL);
- */
- ureport_add_int(ureport, "ureport_version", 1);
- ureport_add_int(ureport, "crash_thread", 0);
-
- ureport_add_item_str(ureport, pd, FILENAME_ARCHITECTURE, NULL);
- ureport_add_item_str(ureport, pd, FILENAME_EXECUTABLE, NULL);
- ureport_add_item_str(ureport, pd, FILENAME_REASON, NULL);
- ureport_add_item_str(ureport, pd, FILENAME_COMPONENT, NULL);
-
- if (!ureport_add_type(ureport, pd))
- {
- error_msg(_("Can't create an uReport without 'type'"));
- json_object_put(ureport);
- return NULL;
- }
-
- ureport_add_pkg(ureport, pd);
- ureport_add_related_pkgs(ureport, pd);
- ureport_add_os(ureport, pd);
-
- ureport_add_core_backtrace(ureport, pd);
- ureport_add_reporter(ureport, "ABRT", VERSION);
-
- ureport_add_oops(ureport, pd);
-
- char *j = xstrdup(json_object_to_json_string(ureport));
- json_object_put(ureport);
-
- return j;
-}
-
-char *ureport_from_dump_dir(const char *dump_dir_path)
-{
- struct dump_dir *dd = dd_opendir(dump_dir_path, DD_OPEN_READONLY);
- if (!dd)
- xfunc_die();
-
- problem_data_t *pd = create_problem_data_from_dump_dir(dd);
-
- dd_close(dd);
- if (!pd)
- xfunc_die(); /* create_problem_data_from_dump_dir already emitted error msg */
-
- char *json_ureport = new_json_ureport(pd);
- problem_data_free(pd);
-
- if (json_ureport == NULL)
- {
- error_msg(_("Not uploading an empty uReport"));
- return NULL;
- }
-
- return json_ureport;
-}
-
-#endif /* USE_SATYR */
-
char *new_json_attachment(const char *bthash, const char *type, const char *data)
{
struct json_object *attachment = json_object_new_object();
diff --git a/src/plugins/reporter-bugzilla.c b/src/plugins/reporter-bugzilla.c
index 626b41f..972a1f0 100644
--- a/src/plugins/reporter-bugzilla.c
+++ b/src/plugins/reporter-bugzilla.c
@@ -21,39 +21,8 @@
#include "abrt_xmlrpc.h"
#include "rhbz.h"
-/* btparser compatibility - once we move to satyr, the else branch of the ifdef
- * can be removed
- */
-#ifdef USE_SATYR
-
-#include <satyr/location.h>
-#include <satyr/gdb_stacktrace.h>
-#include <satyr/gdb_thread.h>
-#include <satyr/gdb_frame.h>
-#include <satyr/strbuf.h>
-
-#else /* USE_SATYR */
-
-#include <btparser/location.h>
-#include <btparser/backtrace.h>
-#include <btparser/thread.h>
-#include <btparser/frame.h>
-#include <btparser/strbuf.h>
-
-#define sr_location btp_location
-#define sr_location_init btp_location_init
-#define sr_gdb_stacktrace btp_backtrace
-#define sr_gdb_stacktrace_parse btp_backtrace_parse
-#define sr_gdb_stacktrace_get_optimized_thread btp_backtrace_get_optimized_thread
-#define sr_gdb_stacktrace_free btp_backtrace_free
-#define sr_gdb_thread btp_thread
-#define sr_gdb_thread_append_to_str btp_thread_append_to_str
-#define sr_gdb_thread_free btp_thread_free
-#define sr_strbuf btp_strbuf
-#define sr_strbuf_new btp_strbuf_new
-#define sr_strbuf_free_nobuf btp_strbuf_free_nobuf
-
-#endif /* USE_SATYR */
+#include <satyr/stacktrace.h>
+#include <satyr/abrt.h>
struct section_t {
char *name;
@@ -365,38 +334,38 @@ int append_short_backtrace(struct strbuf *result, problem_data_t *problem_data,
if (strlen(item->content) >= max_text_size)
{
- struct sr_location location;
- sr_location_init(&location);
+ char *error_msg = NULL;
+ const char *analyzer = problem_data_get_content_or_NULL(problem_data, FILENAME_ANALYZER);
+ if (!analyzer)
+ return 0;
+
+ /* For CCpp crashes, use the GDB-produced backtrace which should be
+ * available by now. sr_abrt_type_from_analyzer returns SR_REPORT_CORE
+ * by default for CCpp crashes.
+ */
+ enum sr_report_type report_type = sr_abrt_type_from_analyzer(analyzer);
+ if (strcmp(analyzer, "CCpp") == 0)
+ report_type = SR_REPORT_GDB;
- /* sr_gdb_stacktrace_parse modifies the input parameter */
- char *content = item->content;
- struct sr_gdb_stacktrace *backtrace = sr_gdb_stacktrace_parse((const char **)&content, &location);
+ struct sr_stacktrace *backtrace = sr_stacktrace_parse(report_type,
+ item->content, &error_msg);
if (!backtrace)
{
- log(_("Can't parse backtrace"));
+ log(_("Can't parse backtrace: %s"), error_msg);
+ free(error_msg);
return 0;
}
/* Get optimized thread stack trace for 10 top most frames */
- struct sr_gdb_thread *thread = sr_gdb_stacktrace_get_optimized_thread(backtrace, 10);
-
- sr_gdb_stacktrace_free(backtrace);
+ truncated = sr_stacktrace_to_short_text(backtrace, 10);
+ sr_stacktrace_free(backtrace);
- if (!thread)
+ if (!truncated)
{
- log(_("Can't find crash thread"));
+ log(_("Can't generate stacktrace description (no crash thread?)"));
return 0;
}
-
- /* Cannot be NULL, it dies on memory error */
- struct sr_strbuf *bt = sr_strbuf_new();
-
- sr_gdb_thread_append_to_str(thread, bt, true);
-
- sr_gdb_thread_free(thread);
-
- truncated = sr_strbuf_free_nobuf(bt);
}
append_text(result,
--
1.7.11.7
More information about the Crash-catcher
mailing list