In case when package debuginfo is present, gdb will output only
function names but no offsets preventing core backtrace generation.
Setting non-existent debuginfo directory resolves this.
---
src/lib/hooklib.c | 29 +++++++++++++++--------
src/plugins/abrt-action-generate-core-backtrace.c | 2 +-
2 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/src/lib/hooklib.c b/src/lib/hooklib.c
index 1b30a5b..ca799e0 100644
--- a/src/lib/hooklib.c
+++ b/src/lib/hooklib.c
@@ -249,17 +249,26 @@ char *get_backtrace(const char *dump_dir_name, unsigned timeout_sec,
const char
// (
https://bugzilla.redhat.com/show_bug.cgi?id=528668):
args[2] = (char*)"-ex";
struct strbuf *set_debug_file_directory = strbuf_new();
- strbuf_append_str(set_debug_file_directory, "set debug-file-directory
/usr/lib/debug");
- const char *p = debuginfo_dirs;
- while (1)
+ if(debuginfo_dirs == NULL)
{
- while (*p == ':')
- p++;
- if (*p == '\0')
- break;
- const char *colon_or_nul = strchrnul(p, ':');
- strbuf_append_strf(set_debug_file_directory, ":%.*s/usr/lib/debug",
(int)(colon_or_nul - p), p);
- p = colon_or_nul;
+ // set non-existent debug file directory to prevent resolving
+ // function names - we need offsets for core backtrace.
+ strbuf_append_str(set_debug_file_directory, "set debug-file-directory
/");
+ }
+ else
+ {
+ strbuf_append_str(set_debug_file_directory, "set debug-file-directory
/usr/lib/debug");
+ const char *p = debuginfo_dirs;
+ while (1)
+ {
+ while (*p == ':')
+ p++;
+ if (*p == '\0')
+ break;
+ const char *colon_or_nul = strchrnul(p, ':');
+ strbuf_append_strf(set_debug_file_directory, ":%.*s/usr/lib/debug",
(int)(colon_or_nul - p), p);
+ p = colon_or_nul;
+ }
}
args[3] = strbuf_free_nobuf(set_debug_file_directory);
diff --git a/src/plugins/abrt-action-generate-core-backtrace.c
b/src/plugins/abrt-action-generate-core-backtrace.c
index 5fccb89..9bd09a4 100644
--- a/src/plugins/abrt-action-generate-core-backtrace.c
+++ b/src/plugins/abrt-action-generate-core-backtrace.c
@@ -106,7 +106,7 @@ int main(int argc, char **argv)
if (strcmp(analyzer, "CCpp") == 0)
{
VERB1 log("Querying gdb for backtrace");
- char *gdb_out = get_backtrace(dump_dir_name, exec_timeout_sec, "");
+ char *gdb_out = get_backtrace(dump_dir_name, exec_timeout_sec, NULL);
if (gdb_out == NULL)
xfunc_die();
--
1.7.11.4