[ABRT PATCHv2 1/2] Update satyr support, drop btparser compatibility
Jakub Filak
jfilak at redhat.com
Mon Jul 15 14:18:59 UTC 2013
Duplicate detection works. Pushed both. Thank you!
On Tue, 2013-07-09 at 18:16 +0200, Martin Milata wrote:
> Closes abrt/satyr#88.
>
> Signed-off-by: Martin Milata <mmilata at redhat.com>
> ---
> configure.ac | 14 +-
> doc/abrt-action-generate-core-backtrace.txt | 50 +-----
> src/daemon/abrt-handle-event.c | 81 +++++-----
> src/include/Makefile.am | 1 -
> src/include/satyr-compat.h | 171 --------------------
> src/plugins/abrt-action-analyze-backtrace.c | 41 +++--
> src/plugins/abrt-action-generate-core-backtrace.c | 180 ++--------------------
> src/plugins/koops_event.conf | 1 -
> src/plugins/python_event.conf | 1 -
> src/plugins/vmcore_event.conf | 1 -
> 10 files changed, 92 insertions(+), 449 deletions(-)
> delete mode 100644 src/include/satyr-compat.h
>
> diff --git a/configure.ac b/configure.ac
> index ccd3901..7b32618 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -92,11 +92,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([GTK], [gtk+-3.0])
> PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.21])
> PKG_CHECK_MODULES([DBUS], [dbus-1])
> @@ -109,14 +104,7 @@ PKG_CHECK_MODULES([LIBREPORT_GTK], [libreport-gtk])
> PKG_CHECK_MODULES([LIBREPORT_WEB], [libreport-web])
> PKG_CHECK_MODULES([POLKIT], [polkit-gobject-1])
> PKG_CHECK_MODULES([GIO], [gio-2.0])
> -
> -[if test "$with_satyr" = "yes"]
> -[then]
> - PKG_CHECK_MODULES([SATYR], [satyr])
> - AC_DEFINE([USE_SATYR], [1], [Use satyr instead of btparser])
> -[else]
> - PKG_CHECK_MODULES([SATYR], [btparser])
> -[fi]
> +PKG_CHECK_MODULES([SATYR], [satyr])
>
> PKG_PROG_PKG_CONFIG
> AC_ARG_WITH([systemdsystemunitdir],
> diff --git a/doc/abrt-action-generate-core-backtrace.txt b/doc/abrt-action-generate-core-backtrace.txt
> index 0e68031..988327f 100644
> --- a/doc/abrt-action-generate-core-backtrace.txt
> +++ b/doc/abrt-action-generate-core-backtrace.txt
> @@ -3,12 +3,11 @@ abrt-action-generate-core-backtrace(1)
>
> NAME
> ----
> -abrt-action-generate-core-backtrace - Generates coredump-level (debuginfo-free)
> -backtrace
> +abrt-action-generate-core-backtrace - Generates coredump-level backtrace
>
> SYNOPSIS
> --------
> -'abrt-action-generate-core-backtrace' [-v] [-d DIR]
> +'abrt-action-generate-core-backtrace' [-v] [-r] [-d DIR]
>
> DESCRIPTION
> -----------
> @@ -22,8 +21,7 @@ However, it only contains information that can be obtained from the coredump
> without debugging symbols available - mainly relative addresses of
> the stored instruction pointers. Such backtrace can still be useful
> for reporting and reproducing the bug and does not require debugging
> -information files to be installed. See <<X1,*FILE FORMAT*>> for the
> -description of the generated file.
> +information files to be installed.
>
> The result is saved in the problem directory in a file named
> 'core_backtrace'.
> @@ -45,48 +43,12 @@ OPTIONS
> -d DIR::
> Path to problem directory.
>
> +-r::
> + Do not hash function fingerprints. Useful for debugging.
> +
> -v::
> Be more verbose. Can be given multiple times.
>
> -[[X1]]
> -FILE FORMAT
> ------------
> -
> -The generated file is a text file containing one line for each stack frame of
> -the thread that most likely caused the crash. The line has following format:
> -
> -------------
> -BUILD_ID OFFSET SYMBOL MODNAME FINGERPRINT
> -------------
> -
> -Where:
> -
> -*BUILD_ID*::
> - Build ID of the binary file the address is mapped to as a hexadecimal string.
> -
> -*OFFSET*::
> - Offset from the start of the executable section of aforementioned file the
> - stored instruction pointer points to. Number in hexadecimal format.
> -
> -*SYMBOL*::
> - Name of the function if it is present in the binary (which is often the case
> - for shared libraries).
> -
> -*MODNAME*::
> - Name of the module. Contains name of a library or *[exe]* if it is the
> - executable.
> -
> -*FINGERPRINT*::
> - Fingerprint of the function the instruction pointer points to (x86-64 only).
> - The fingerprint is generated from various aspects of the machine code of the
> - function in question. Its purpose is to supplant the BUILD_ID and OFFSET
> - pair in case they are not present and to allow for comparison of
> - coredump-level backtraces produced by two slightly different versions of a
> - program.
> -
> -Dash in place of any of the parts indicates that the part is unknown.
> -
> -
>
> AUTHORS
> -------
> diff --git a/src/daemon/abrt-handle-event.c b/src/daemon/abrt-handle-event.c
> index a426566..eadb058 100644
> --- a/src/daemon/abrt-handle-event.c
> +++ b/src/daemon/abrt-handle-event.c
> @@ -16,22 +16,42 @@
> with this program; if not, write to the Free Software Foundation, Inc.,
> 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> */
> +#include <satyr/thread.h>
> +#include <satyr/stacktrace.h>
> +#include <satyr/distance.h>
> +#include <satyr/abrt.h>
>
> #include "libabrt.h"
> #include <libreport/run_event.h>
> -#include "satyr-compat.h"
> +
> +/* 70 % similarity */
> +#define BACKTRACE_DUP_THRESHOLD 0.3
>
> static char *uid = NULL;
> static char *uuid = NULL;
> -static struct sr_core_stacktrace *corebt = NULL;
> +static struct sr_stacktrace *corebt = NULL;
> +static char *analyzer = NULL;
> static char *crash_dump_dup_name = NULL;
>
> -static int core_backtrace_is_duplicate(struct sr_core_stacktrace *bt1,
> +static char* load_backtrace(const struct dump_dir *dd)
> +{
> + const char *filename = FILENAME_BACKTRACE;
> + if (strcmp(analyzer, "CCpp") == 0)
> + {
> + filename = FILENAME_CORE_BACKTRACE;
> + }
> +
> + return dd_load_text_ext(dd, filename,
> + DD_FAIL_QUIETLY_ENOENT|DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE);
> +}
> +
> +static int core_backtrace_is_duplicate(struct sr_stacktrace *bt1,
> const char *bt2_text)
> {
> int result;
> char *error_message;
> - struct sr_core_stacktrace *bt2 = sr_core_stacktrace_from_json_text(bt2_text, &error_message);
> + struct sr_stacktrace *bt2 = sr_stacktrace_parse(sr_abrt_type_from_analyzer(analyzer),
> + bt2_text, &error_message);
> if (bt2 == NULL)
> {
> VERB1 log("Failed to parse backtrace, considering it not duplicate: %s", error_message);
> @@ -39,10 +59,10 @@ static int core_backtrace_is_duplicate(struct sr_core_stacktrace *bt1,
> return 0;
> }
>
> - struct sr_core_thread *thread1 = sr_core_stacktrace_find_crash_thread(bt1);
> - struct sr_core_thread *thread2 = sr_core_stacktrace_find_crash_thread(bt2);
> + struct sr_thread *thread1 = sr_stacktrace_find_crash_thread(bt1);
> + struct sr_thread *thread2 = sr_stacktrace_find_crash_thread(bt2);
>
> - int length2 = sr_core_thread_get_frame_count(thread2);
> + int length2 = sr_thread_frame_count(thread2);
>
> if (length2 <= 0)
> {
> @@ -52,7 +72,7 @@ static int core_backtrace_is_duplicate(struct sr_core_stacktrace *bt1,
> }
>
> /* This is an ugly workaround for https://github.com/abrt/btparser/issues/6 */
> -#ifndef USE_SATYR
> + /*
> int length1 = sr_core_thread_get_frame_count(thread1);
>
> if (length1 <= 2 || length2 <= 2)
> @@ -61,23 +81,14 @@ static int core_backtrace_is_duplicate(struct sr_core_stacktrace *bt1,
> result = (sr_core_thread_cmp(thread1, thread2) == 0);
> goto end;
> }
> -#endif
> -
> - float distance = sr_distance_core(SR_DISTANCE_DAMERAU_LEVENSHTEIN,
> - thread1, thread2);
> + */
>
> - if (distance == -1)
> - {
> - result = 0;
> - }
> - else
> - {
> - VERB2 log("Distance between backtraces: %f", distance);
> - result = (distance <= BACKTRACE_DUP_THRESHOLD);
> - }
> + float distance = sr_distance(SR_DISTANCE_DAMERAU_LEVENSHTEIN, thread1, thread2);
> + VERB2 log("Distance between backtraces: %f", distance);
> + result = (distance <= BACKTRACE_DUP_THRESHOLD);
>
> end:
> - sr_core_stacktrace_free(bt2);
> + sr_stacktrace_free(bt2);
>
> return result;
> }
> @@ -126,22 +137,17 @@ static void dup_uuid_fini(void)
>
> static void dup_corebt_init(const struct dump_dir *dd)
> {
> - char *corebt_text;
> -
> if (corebt)
> return; /* already checked */
>
> - corebt_text = dd_load_text_ext(dd, FILENAME_CORE_BACKTRACE,
> - DD_FAIL_QUIETLY_ENOENT | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE
> - );
> -
> + char *corebt_text = load_backtrace(dd);
> if (!corebt_text)
> return; /* no backtrace */
>
> + /* sr_stacktrace_parse moves the pointer */
> char *error_message;
> - corebt = sr_core_stacktrace_from_json_text(corebt_text,
> - &error_message);
> -
> + corebt = sr_stacktrace_parse(sr_abrt_type_from_analyzer(analyzer),
> + corebt_text, &error_message);
> if (!corebt)
> {
> VERB1 log("Failed to load core stacktrace: %s", error_message);
> @@ -157,9 +163,8 @@ static int dup_corebt_compare(const struct dump_dir *dd)
> return 0;
>
> int isdup;
> - char *dd_corebt = dd_load_text_ext(dd, FILENAME_CORE_BACKTRACE,
> - DD_FAIL_QUIETLY_ENOENT | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE);
>
> + char *dd_corebt = load_backtrace(dd);
> if (!dd_corebt)
> return 0;
>
> @@ -174,7 +179,7 @@ static int dup_corebt_compare(const struct dump_dir *dd)
>
> static void dup_corebt_fini(void)
> {
> - sr_core_stacktrace_free(corebt);
> + sr_stacktrace_free(corebt);
> corebt = NULL;
> }
>
> @@ -208,13 +213,13 @@ static int is_crash_a_dup(const char *dump_dir_name, void *param)
> if (!dd)
> return 0; /* wtf? (error, but will be handled elsewhere later) */
>
> - dup_uuid_init(dd);
> - dup_corebt_init(dd);
> -
> - char *analyzer = dd_load_text(dd, FILENAME_ANALYZER);
> + analyzer = dd_load_text(dd, FILENAME_ANALYZER);
> /* dump_dir_name can be relative */
> dump_dir_name = realpath(dump_dir_name, NULL);
>
> + dup_uuid_init(dd);
> + dup_corebt_init(dd);
> +
> dd_close(dd);
>
> DIR *dir = opendir(g_settings_dump_location);
> diff --git a/src/include/Makefile.am b/src/include/Makefile.am
> index addbaa5..49a6f5c 100644
> --- a/src/include/Makefile.am
> +++ b/src/include/Makefile.am
> @@ -5,5 +5,4 @@ libabrt_include_HEADERS = \
> libabrt.h \
> abrt-dbus.h \
> hooklib.h \
> - satyr-compat.h \
> problem_api.h
> diff --git a/src/include/satyr-compat.h b/src/include/satyr-compat.h
> deleted file mode 100644
> index 23f6bb7..0000000
> --- a/src/include/satyr-compat.h
> +++ /dev/null
> @@ -1,171 +0,0 @@
> -/*
> - Copyright (C) 2013 RedHat inc.
> -
> - This program is free software; you can redistribute it and/or modify
> - it under the terms of the GNU General Public License as published by
> - the Free Software Foundation; either version 2 of the License, or
> - (at your option) any later version.
> -
> - This program is distributed in the hope that it will be useful,
> - but WITHOUT ANY WARRANTY; without even the implied warranty of
> - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> - GNU General Public License for more details.
> -
> - You should have received a copy of the GNU General Public License along
> - with this program; if not, write to the Free Software Foundation, Inc.,
> - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> -*/
> -/*
> - * Compatibility header for transition from btparser to satyr. When the
> - * possibility to compile abrt against btparser is removed, delete this file
> - * and include the relevant satyr headers instead.
> - */
> -#ifndef SATYR_COMPAT_H_
> -#define SATYR_COMPAT_H_
> -
> -#include "config.h"
> -
> -#ifdef USE_SATYR
> -/* Satyr is used, nothing to do, just include everything we may need. */
> -
> -#include <satyr/core_frame.h>
> -#include <satyr/core_stacktrace.h>
> -#include <satyr/core_thread.h>
> -#include <satyr/distance.h>
> -#include <satyr/gdb_frame.h>
> -#include <satyr/gdb_stacktrace.h>
> -#include <satyr/location.h>
> -#include <satyr/metrics.h>
> -#include <satyr/normalize.h>
> -#include <satyr/sha1.h>
> -#include <satyr/utils.h>
> -
> -#define BACKTRACE_DUP_THRESHOLD 0.3
> -
> -#else /* USE_SATYR */
> -/* We use btparser. Wrap the calls to btparser in a satyr-compatible interface. */
> -
> -#include <btparser/frame.h>
> -#include <btparser/thread.h>
> -#include <btparser/normalize.h>
> -#include <btparser/metrics.h>
> -#include <btparser/core-backtrace.h>
> -#include <btparser/backtrace.h>
> -#include <btparser/frame.h>
> -#include <btparser/location.h>
> -#include "libabrt.h" /* xstrdup */
> -
> -#define BACKTRACE_DUP_THRESHOLD 2.0
> -
> -/* abrt-handle-event.c */
> -#define sr_core_stacktrace btp_thread
> -#define sr_core_thread btp_thread
> -
> -enum sr_distance_type
> -{
> - SR_DISTANCE_DAMERAU_LEVENSHTEIN
> -};
> -
> -/* The functions should be static but that generates unused function warnings.
> - * We don't include this header in two compilation units that are then linked
> - * together anyway, so this should work. And this file should be gone soon ...
> - */
> -struct sr_core_stacktrace *
> -sr_core_stacktrace_from_json_text(const char *text,
> - char **error_message)
> -{
> - struct btp_thread *thread = btp_load_core_backtrace(text);
> - if (!thread)
> - {
> - *error_message = xstrdup(
> - "Failed to parse backtrace, considering it not duplicate");
> - return NULL;
> - }
> - return btp_load_core_backtrace(text);
> -}
> -
> -struct sr_core_thread *
> -sr_core_stacktrace_find_crash_thread(struct sr_core_stacktrace *stacktrace)
> -{
> - return stacktrace;
> -}
> -
> -int
> -sr_core_thread_get_frame_count(struct sr_core_thread *thread)
> -{
> - return btp_thread_get_frame_count(thread);
> -}
> -
> -int
> -sr_core_thread_cmp(struct sr_core_thread *thread1,
> - struct sr_core_thread *thread2)
> -{
> - return btp_thread_cmp(thread1, thread2);
> -}
> -
> -float
> -sr_distance_core(enum sr_distance_type distance_type,
> - struct sr_core_thread *thread1,
> - struct sr_core_thread *thread2)
> -{
> - return btp_thread_levenshtein_distance_custom(thread1, thread2, true,
> - btp_core_backtrace_frame_cmp);
> -}
> -
> -void
> -sr_core_stacktrace_free(struct sr_core_stacktrace *stacktrace)
> -{
> - btp_free_core_backtrace(stacktrace);
> -}
> -
> -/* abrt-action-analyze-backtrace.c */
> -#define sr_location btp_location
> -#define sr_gdb_stacktrace btp_backtrace
> -#define sr_gdb_frame btp_frame
> -
> -void
> -sr_location_init(struct sr_location *location)
> -{
> - btp_location_init(location);
> -}
> -
> -struct sr_gdb_stacktrace *
> -sr_gdb_stacktrace_parse(const char **input,
> - struct sr_location *location)
> -{
> - return btp_backtrace_parse(input, location);
> -}
> -
> -char *
> -sr_gdb_stacktrace_get_duplication_hash(struct sr_gdb_stacktrace *stacktrace)
> -{
> - return btp_backtrace_get_duplication_hash(stacktrace);
> -}
> -
> -float
> -sr_gdb_stacktrace_quality_complex(struct sr_gdb_stacktrace *stacktrace)
> -{
> - return btp_backtrace_quality_complex(stacktrace);
> -}
> -
> -struct sr_gdb_frame *
> -sr_gdb_stacktrace_get_crash_frame(struct sr_gdb_stacktrace *stacktrace)
> -{
> - return btp_backtrace_get_crash_frame(stacktrace);
> -}
> -
> -void
> -sr_gdb_frame_free(struct sr_gdb_frame *frame)
> -{
> - btp_frame_free(frame);
> -}
> -
> -void
> -sr_gdb_stacktrace_free(struct sr_gdb_stacktrace *stacktrace)
> -{
> - btp_backtrace_free(stacktrace);
> -}
> -
> -#endif /* USE_SATYR */
> -
> -#endif /* SATYR_COMPAT_H_ */
> diff --git a/src/plugins/abrt-action-analyze-backtrace.c b/src/plugins/abrt-action-analyze-backtrace.c
> index a980213..9348195 100644
> --- a/src/plugins/abrt-action-analyze-backtrace.c
> +++ b/src/plugins/abrt-action-analyze-backtrace.c
> @@ -15,7 +15,11 @@
> with this program; if not, write to the Free Software Foundation, Inc.,
> 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> */
> -#include "satyr-compat.h"
> +#include <satyr/location.h>
> +#include <satyr/thread.h>
> +#include <satyr/gdb/frame.h>
> +#include <satyr/gdb/stacktrace.h>
> +
> #include "libabrt.h"
>
> static const char *dump_dir_name = ".";
> @@ -130,18 +134,29 @@ int main(int argc, char **argv)
> }
>
> /* Compute duplication hash. */
> - char *str_hash_core = sr_gdb_stacktrace_get_duplication_hash(backtrace);
> - struct strbuf *str_hash = strbuf_new();
> - strbuf_append_str(str_hash, component);
> - strbuf_append_str(str_hash, str_hash_core);
> -
> - VERB3 log("Generating duphash: %s", str_hash->buf);
> - char hash_str[SHA1_RESULT_LEN*2 + 1];
> - create_hash(hash_str, str_hash->buf);
> -
> - dd_save_text(dd, FILENAME_DUPHASH, hash_str);
> - strbuf_free(str_hash);
> - free(str_hash_core);
> + struct sr_thread *crash_thread =
> + (struct sr_thread *)sr_gdb_stacktrace_find_crash_thread(backtrace);
> +
> + if (crash_thread)
> + {
> + char *hash_str;
> +
> + if (g_verbose >= 3)
> + {
> + hash_str = sr_thread_get_duphash(crash_thread, 3, component,
> + SR_DUPHASH_NOHASH);
> + log("Generating duphash: %s", hash_str);
> + free(hash_str);
> + }
> +
> + hash_str = sr_thread_get_duphash(crash_thread, 3, component,
> + SR_DUPHASH_NORMAL);
> + dd_save_text(dd, FILENAME_DUPHASH, hash_str);
> + free(hash_str);
> + }
> + else
> + log(_("Crash thread not found"));
> +
>
> /* Compute the backtrace rating. */
> float quality = sr_gdb_stacktrace_quality_complex(backtrace);
> diff --git a/src/plugins/abrt-action-generate-core-backtrace.c b/src/plugins/abrt-action-generate-core-backtrace.c
> index 24d69cb..a549a53 100644
> --- a/src/plugins/abrt-action-generate-core-backtrace.c
> +++ b/src/plugins/abrt-action-generate-core-backtrace.c
> @@ -16,74 +16,10 @@
> with this program; if not, write to the Free Software Foundation, Inc.,
> 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> */
> -#include "libabrt.h"
> -
> -#ifdef USE_SATYR
> -/* If satyr is used, just run "satyr abrt-create-core-stacktrace" on the dump directory.
> - */
> -
> -#include <unistd.h>
> -
> -int main(int argc, char **argv)
> -{
> - VERB1 log("Running 'satyr abrt-create-core-stacktrace .'");
> - execlp("satyr", "satyr", "abrt-create-core-stacktrace", ".", NULL);
> - perror_msg_and_die("Can't execute satyr");
> -
> - return 0;
> -}
> -
> -#else /* USE_SATYR */
> -/* Btparser is used. Once the support is removed, this whole file can be
> - * deleted and ccpp_event.conf modified accordingly.
> - */
> +#include <satyr/abrt.h>
> +#include <satyr/utils.h>
>
> -#include <btparser/hash_sha1.h>
> -#include <btparser/utils.h>
> -#include <btparser/core-backtrace.h>
> -#include <btparser/core-backtrace-python.h>
> -#include <btparser/core-backtrace-oops.h>
> -
> -static bool raw_fingerprints = false;
> -
> -/* add the information about '?' flag to fingerprint field
> - fingerprint is otherwise always empty for kerneloops */
> -static void oops_add_question_marks(GList *backtrace)
> -{
> - GList *elem = backtrace;
> - struct backtrace_entry *entry;
> - while (elem)
> - {
> - entry = (struct backtrace_entry *)elem->data;
> - if (entry->function_initial_loc)
> - entry->fingerprint = btp_strdup("?");
> -
> - elem = g_list_next(elem);
> - }
> -}
> -
> -static void hash_fingerprints(GList *backtrace)
> -{
> - GList *elem = backtrace;
> - struct backtrace_entry *entry;
> - char bin_hash[BTP_SHA1_RESULT_BIN_LEN], hash[BTP_SHA1_RESULT_LEN];
> - btp_sha1_ctx_t ctx;
> - while (elem)
> - {
> - entry = (struct backtrace_entry *)elem->data;
> - if (entry->fingerprint)
> - {
> - btp_sha1_begin(&ctx);
> - btp_sha1_hash(&ctx, entry->fingerprint, strlen(entry->fingerprint));
> - btp_sha1_end(&ctx, bin_hash);
> - btp_bin2hex(hash, bin_hash, sizeof(bin_hash))[0] = '\0';
> -
> - free(entry->fingerprint);
> - entry->fingerprint = btp_strndup(hash, sizeof(hash));
> - }
> - elem = g_list_next(elem);
> - }
> -}
> +#include "libabrt.h"
>
> int main(int argc, char **argv)
> {
> @@ -97,12 +33,11 @@ int main(int argc, char **argv)
> abrt_init(argv);
>
> const char *dump_dir_name = ".";
> - /* 60 seconds was too limiting on slow machines */
> - const int exec_timeout_sec = 240;
> + bool raw_fingerprints = false;
>
> /* Can't keep these strings/structs static: _() doesn't support that */
> const char *program_usage_string = _(
> - "& [-v] -d DIR\n"
> + "& [-v] [-r] -d DIR\n"
> "\n"
> "Creates coredump-level backtrace from core dump and corresponding binary"
> );
> @@ -123,109 +58,22 @@ int main(int argc, char **argv)
> export_abrt_envvars(0);
>
> if (g_verbose > 1)
> - btp_debug_parser = true;
> + sr_debug_parser = true;
>
> /* Let user know what's going on */
> log(_("Generating core_backtrace"));
>
> - /* Get the executable name -- unstrip doesn't know it. */
> - struct dump_dir *dd = dd_opendir(dump_dir_name, DD_OPEN_READONLY);
> - if (!dd)
> - xfunc_die(); /* dd_opendir already printed error msg */
> - char *analyzer = dd_load_text(dd, FILENAME_ANALYZER);
> - char *executable = dd_load_text_ext(dd, FILENAME_EXECUTABLE,
> - DD_FAIL_QUIETLY_ENOENT);
> - char *txt_backtrace = dd_load_text_ext(dd, FILENAME_BACKTRACE,
> - DD_FAIL_QUIETLY_ENOENT);
> - char *kernel = dd_load_text_ext(dd, FILENAME_KERNEL,
> - DD_FAIL_QUIETLY_ENOENT |
> - DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE);
> - dd_close(dd);
> -
> - /* Parse addresses and eventual symbols from the output */
> - GList *backtrace;
> - if (strcmp(analyzer, "CCpp") == 0)
> - {
> - char *gdb_out = get_backtrace(dump_dir_name, exec_timeout_sec, NULL);
> - if (gdb_out == NULL)
> - xfunc_die();
> -
> - /* We observed a case when we were stuck for 36 minutes after emitting
> - * "Generating backtrace" message (in get_backtrace).
> - * We don't know whether we finished bt generation
> - * and were stuck somewhere below this point, or we were stuck
> - * in get_backtrace(). For now, we emit this message
> - * even in non-verbose mode to aid in future debugging:
> - */
> - log(_("Backtrace is generated, %u bytes"), (int)strlen(gdb_out));
> -
> - backtrace = btp_backtrace_extract_addresses(gdb_out);
> - VERB1 log("Extracted %d frames from the backtrace", g_list_length(backtrace));
> - free(gdb_out);
> + char *error_message = NULL;
> + bool success = sr_abrt_create_core_stacktrace(dump_dir_name,
> + !raw_fingerprints,
> + &error_message);
>
> - VERB1 log("Running eu-unstrip -n to obtain build ids");
> - /* Run eu-unstrip -n to obtain the ids. This should be rewritten to read
> - * them directly from the core. */
> - char *unstrip_output = run_unstrip_n(dump_dir_name, /*timeout_sec:*/ 30);
> - if (unstrip_output == NULL)
> - error_msg_and_die("Running eu-unstrip failed");
> - btp_core_assign_build_ids(backtrace, unstrip_output, executable);
> - free(unstrip_output);
> -
> - /* Remove empty lines from the backtrace. */
> - GList *loop = backtrace;
> - while (loop != NULL)
> - {
> - struct backtrace_entry *entry = loop->data;
> - GList *const tmp_next = g_list_next(loop);
> - if (!entry->build_id && !entry->filename && !entry->modname)
> - backtrace = g_list_delete_link(backtrace, loop);
> - loop = tmp_next;
> - }
> -
> - /* Extract address ranges from all the executables in the backtrace */
> - VERB1 log("Computing function fingerprints");
> - btp_core_backtrace_fingerprint(backtrace);
> - if (!raw_fingerprints)
> - hash_fingerprints(backtrace);
> - }
> - else if (strcmp(analyzer, "Python") == 0)
> - backtrace = btp_parse_python_backtrace(txt_backtrace);
> - else if (strcmp(analyzer, "Kerneloops") == 0 || strcmp(analyzer, "vmcore") == 0)
> + if (!success)
> {
> - /* btp_parse_kerneloops() accepts NULL in the kernelver argument. It is not
> - * documented, but it is true. */
> - if (kernel != NULL)
> - {
> - char *space = strchr(kernel, ' ');
> - if (space)
> - *space = '\0';
> - }
> -
> - backtrace = btp_parse_kerneloops(txt_backtrace, kernel);
> - oops_add_question_marks(backtrace);
> + log(_("Error: %s"), error_message);
> + free(error_message);
> + return 1;
> }
> - else
> - error_msg_and_die(_("Core-backtraces are not supported for '%s'"), analyzer);
> -
> - free(txt_backtrace);
> - free(kernel);
> - free(executable);
> - free(analyzer);
>
> - char *formatted_backtrace = btp_core_backtrace_fmt(backtrace);
> -
> - dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
> - if (!dd)
> - xfunc_die();
> - dd_save_text(dd, FILENAME_CORE_BACKTRACE, formatted_backtrace);
> - dd_close(dd);
> -
> - log(_("Core backtrace is generated and saved, %u bytes"), (int)strlen(formatted_backtrace));
> -
> - free(formatted_backtrace);
> - btp_core_backtrace_free(backtrace);
> return 0;
> }
> -
> -#endif /* USE_SATYR */
> diff --git a/src/plugins/koops_event.conf b/src/plugins/koops_event.conf
> index 7409922..9966775 100644
> --- a/src/plugins/koops_event.conf
> +++ b/src/plugins/koops_event.conf
> @@ -3,7 +3,6 @@ EVENT=post-create analyzer=Kerneloops
> # >> instead of > is due to bugzilla.redhat.com/show_bug.cgi?id=854266
> abrt-action-analyze-oops &&
> dmesg >>dmesg &&
> - abrt-action-generate-core-backtrace
> abrt-action-save-kernel-data
>
> # If you want behavior similar to one provided by kerneloops daemon
> diff --git a/src/plugins/python_event.conf b/src/plugins/python_event.conf
> index 1aa0e99..3a45373 100644
> --- a/src/plugins/python_event.conf
> +++ b/src/plugins/python_event.conf
> @@ -8,7 +8,6 @@ EVENT=post-create analyzer=Python
> exit 1
> fi
> abrt-action-analyze-python
> - abrt-action-generate-core-backtrace
>
> EVENT=report_Bugzilla analyzer=Python component!=anaconda
> test -f component || abrt-action-save-package-data
> diff --git a/src/plugins/vmcore_event.conf b/src/plugins/vmcore_event.conf
> index f6e260e..5d2d099 100644
> --- a/src/plugins/vmcore_event.conf
> +++ b/src/plugins/vmcore_event.conf
> @@ -2,7 +2,6 @@
> EVENT=analyze_VMcore analyzer=vmcore
> abrt-action-analyze-vmcore &&
> abrt-action-analyze-oops &&
> - abrt-action-generate-core-backtrace &&
> abrt-action-save-kernel-data
>
> # If you want behavior similar to one provided by kerneloops daemon
More information about the Crash-catcher
mailing list