|
Matej Habrnal |
fa1950 |
From 0f669af4d7180b12142a41117ae2459d6960dd31 Mon Sep 17 00:00:00 2001
|
|
Matej Habrnal |
fa1950 |
From: Martin Milata <mmilata@redhat.com>
|
|
Matej Habrnal |
fa1950 |
Date: Mon, 1 Dec 2014 12:05:36 +0100
|
|
Matej Habrnal |
fa1950 |
Subject: [PATCH] Create core backtrace in unwind hook
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
Related to #829.
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
We need to implement #882 in order for this to work. This change
|
|
Matej Habrnal |
fa1950 |
requires (yet unreleased) satyr-0.16.
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
The feature is turned off by default, you need to pass
|
|
Matej Habrnal |
fa1950 |
--enable-dump-time-unwind to configure in order to enable it.
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
Signed-off-by: Martin Milata <mmilata@redhat.com>
|
|
Matej Habrnal |
fa1950 |
---
|
|
Matej Habrnal |
fa1950 |
configure.ac | 12 ++
|
|
Matej Habrnal |
fa1950 |
doc/abrt-CCpp.conf.txt | 18 +++
|
|
Matej Habrnal |
fa1950 |
.../en-US/Automatic_Bug_Reporting_Tool_ABRT.xml | 2 +-
|
|
Matej Habrnal |
fa1950 |
src/hooks/CCpp.conf | 15 +++
|
|
Matej Habrnal |
fa1950 |
src/hooks/abrt-hook-ccpp.c | 126 ++++++++++++++-------
|
|
Matej Habrnal |
fa1950 |
src/hooks/abrt-install-ccpp-hook.in | 4 +-
|
|
Matej Habrnal |
fa1950 |
6 files changed, 132 insertions(+), 45 deletions(-)
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
diff --git a/configure.ac b/configure.ac
|
|
Matej Habrnal |
fa1950 |
index 71d7c18..d7e0ea5 100644
|
|
Matej Habrnal |
fa1950 |
--- a/configure.ac
|
|
Matej Habrnal |
fa1950 |
+++ b/configure.ac
|
|
Matej Habrnal |
fa1950 |
@@ -266,6 +266,18 @@ AC_ARG_ENABLE([addon-vmcore],
|
|
Matej Habrnal |
fa1950 |
AM_CONDITIONAL(BUILD_ADDON_VMCORE, false)
|
|
Matej Habrnal |
fa1950 |
[fi]
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
+# Perform stack unwind on live/dying process in the core handler?
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+AC_ARG_ENABLE([dump-time-unwind],
|
|
Matej Habrnal |
fa1950 |
+ AS_HELP_STRING([--enable-dump-time-unwind],
|
|
Matej Habrnal |
fa1950 |
+ [create core stack trace while the crashed process is still in memory (default is no)]),
|
|
Matej Habrnal |
fa1950 |
+ [], [enable_dump_time_unwind=no])
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+[if test "$enable_native_unwinder" = "yes" -a "$enable_dump_time_unwind" = "yes"]
|
|
Matej Habrnal |
fa1950 |
+[then]
|
|
Matej Habrnal |
fa1950 |
+ AC_DEFINE([ENABLE_DUMP_TIME_UNWIND], [1], [Create core stacktrace while the process is still in memory.])
|
|
Matej Habrnal |
fa1950 |
+[fi]
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
AC_SUBST(CONF_DIR)
|
|
Matej Habrnal |
fa1950 |
AC_SUBST(DEFAULT_CONF_DIR)
|
|
Matej Habrnal |
fa1950 |
AC_SUBST(VAR_RUN)
|
|
Matej Habrnal |
fa1950 |
diff --git a/doc/abrt-CCpp.conf.txt b/doc/abrt-CCpp.conf.txt
|
|
Matej Habrnal |
fa1950 |
index ad3830b..498d53d 100644
|
|
Matej Habrnal |
fa1950 |
--- a/doc/abrt-CCpp.conf.txt
|
|
Matej Habrnal |
fa1950 |
+++ b/doc/abrt-CCpp.conf.txt
|
|
Matej Habrnal |
fa1950 |
@@ -19,12 +19,30 @@ SaveBinaryImage = 'yes' / 'no' ...::
|
|
Matej Habrnal |
fa1950 |
Useful, for example, when _deleted binary_ segfaults.
|
|
Matej Habrnal |
fa1950 |
Default is 'no'.
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
+CreateCoreBacktrace = 'yes' / 'no' ...::
|
|
Matej Habrnal |
fa1950 |
+ When this option is set to 'yes', core backtrace is generated
|
|
Matej Habrnal |
fa1950 |
+ from the memory image of the crashing process. Only the crash
|
|
Matej Habrnal |
fa1950 |
+ thread is present in the backtrace. This feature requires
|
|
Matej Habrnal |
fa1950 |
+ kernel 3.18 or newer, otherwise the core backtrace is not
|
|
Matej Habrnal |
fa1950 |
+ created.
|
|
Matej Habrnal |
fa1950 |
+ Default is 'yes'.
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+SaveFullCore = 'yes' / 'no' ...::
|
|
Matej Habrnal |
fa1950 |
+ Save full coredump? If set to 'no', coredump won't be saved
|
|
Matej Habrnal |
fa1950 |
+ and you won't be able to report the crash to Bugzilla. Only
|
|
Matej Habrnal |
fa1950 |
+ useful with 'CreateCoreBacktrace' set to 'yes'. Please
|
|
Matej Habrnal |
fa1950 |
+ note that if this option is set to 'no' and MakeCompatCore
|
|
Matej Habrnal |
fa1950 |
+ is set to 'yes', the core is still written to the current
|
|
Matej Habrnal |
fa1950 |
+ directory.
|
|
Matej Habrnal |
fa1950 |
+ Default is 'yes'.
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
VerboseLog = NUM::
|
|
Matej Habrnal |
fa1950 |
Used to make the hook more verbose
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
SEE ALSO
|
|
Matej Habrnal |
fa1950 |
--------
|
|
Matej Habrnal |
fa1950 |
abrt.conf(5)
|
|
Matej Habrnal |
fa1950 |
+abrt-action-generate-core-backtrace(1)
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
AUTHORS
|
|
Matej Habrnal |
fa1950 |
-------
|
|
Matej Habrnal |
fa1950 |
diff --git a/doc/deployment/en-US/Automatic_Bug_Reporting_Tool_ABRT.xml b/doc/deployment/en-US/Automatic_Bug_Reporting_Tool_ABRT.xml
|
|
Matej Habrnal |
fa1950 |
index e11307a..daee375 100644
|
|
Matej Habrnal |
fa1950 |
--- a/doc/deployment/en-US/Automatic_Bug_Reporting_Tool_ABRT.xml
|
|
Matej Habrnal |
fa1950 |
+++ b/doc/deployment/en-US/Automatic_Bug_Reporting_Tool_ABRT.xml
|
|
Matej Habrnal |
fa1950 |
@@ -187,7 +187,7 @@ Starting abrt daemon: [ OK ]</screen>
|
|
Matej Habrnal |
fa1950 |
<para>
|
|
Matej Habrnal |
fa1950 |
Please note that installing <application>ABRT</application> packages overwrites the <filename>/proc/sys/kernel/core_pattern</filename> file which can contain a template used to name core dump files. The content of this file will be overwritten to:
|
|
Matej Habrnal |
fa1950 |
</para>
|
|
Matej Habrnal |
fa1950 |
- <programlisting language="Bash">|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e</programlisting>
|
|
Matej Habrnal |
fa1950 |
+ <programlisting language="Bash">|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e %i</programlisting>
|
|
Matej Habrnal |
fa1950 |
</warning>
|
|
Matej Habrnal |
fa1950 |
<para>
|
|
Matej Habrnal |
fa1950 |
Finally, if you run ABRT in a graphical desktop environment, you can verify that the <systemitem class="service">ABRT notification applet</systemitem> is running:
|
|
Matej Habrnal |
fa1950 |
diff --git a/src/hooks/CCpp.conf b/src/hooks/CCpp.conf
|
|
Matej Habrnal |
fa1950 |
index d199116..b1a0a22 100644
|
|
Matej Habrnal |
fa1950 |
--- a/src/hooks/CCpp.conf
|
|
Matej Habrnal |
fa1950 |
+++ b/src/hooks/CCpp.conf
|
|
Matej Habrnal |
fa1950 |
@@ -8,6 +8,21 @@ MakeCompatCore = yes
|
|
Matej Habrnal |
fa1950 |
# (useful, for example, when _deleted binary_ segfaults)
|
|
Matej Habrnal |
fa1950 |
SaveBinaryImage = no
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
+# When this option is set to 'yes', core backtrace is generated
|
|
Matej Habrnal |
fa1950 |
+# from the memory image of the crashing process. Only the crash
|
|
Matej Habrnal |
fa1950 |
+# thread is present in the backtrace. This feature requires
|
|
Matej Habrnal |
fa1950 |
+# kernel 3.18 or newer, otherwise the core backtrace is not
|
|
Matej Habrnal |
fa1950 |
+# created.
|
|
Matej Habrnal |
fa1950 |
+CreateCoreBacktrace = yes
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+# Save full coredump? If set to 'no', coredump won't be saved
|
|
Matej Habrnal |
fa1950 |
+# and you won't be able to report the crash to Bugzilla. Only
|
|
Matej Habrnal |
fa1950 |
+# useful with CreateCoreBacktrace set to 'yes'. Please
|
|
Matej Habrnal |
fa1950 |
+# note that if this option is set to 'no' and MakeCompatCore
|
|
Matej Habrnal |
fa1950 |
+# is set to 'yes', the core is still written to the current
|
|
Matej Habrnal |
fa1950 |
+# directory.
|
|
Matej Habrnal |
fa1950 |
+SaveFullCore = yes
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
# Used for debugging the hook
|
|
Matej Habrnal |
fa1950 |
#VerboseLog = 2
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
diff --git a/src/hooks/abrt-hook-ccpp.c b/src/hooks/abrt-hook-ccpp.c
|
|
Matej Habrnal |
fa1950 |
index 3785d89..57c56a7 100644
|
|
Matej Habrnal |
fa1950 |
--- a/src/hooks/abrt-hook-ccpp.c
|
|
Matej Habrnal |
fa1950 |
+++ b/src/hooks/abrt-hook-ccpp.c
|
|
Matej Habrnal |
fa1950 |
@@ -21,6 +21,11 @@
|
|
Matej Habrnal |
fa1950 |
#include <sys/utsname.h>
|
|
Matej Habrnal |
fa1950 |
#include "libabrt.h"
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
+#ifdef ENABLE_DUMP_TIME_UNWIND
|
|
Matej Habrnal |
fa1950 |
+#include <satyr/abrt.h>
|
|
Matej Habrnal |
fa1950 |
+#include <satyr/utils.h>
|
|
Matej Habrnal |
fa1950 |
+#endif /* ENABLE_DUMP_TIME_UNWIND */
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
#define DUMP_SUID_UNSAFE 1
|
|
Matej Habrnal |
fa1950 |
#define DUMP_SUID_SAFE 2
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
@@ -151,13 +156,13 @@ static struct dump_dir *dd;
|
|
Matej Habrnal |
fa1950 |
* %g - gid
|
|
Matej Habrnal |
fa1950 |
* %t - UNIX time of dump
|
|
Matej Habrnal |
fa1950 |
* %e - executable filename
|
|
Matej Habrnal |
fa1950 |
- * %h - hostname
|
|
Matej Habrnal |
fa1950 |
+ * %i - crash thread tid
|
|
Matej Habrnal |
fa1950 |
* %% - output one "%"
|
|
Matej Habrnal |
fa1950 |
*/
|
|
Matej Habrnal |
fa1950 |
/* Hook must be installed with exactly the same sequence of %c specifiers.
|
|
Matej Habrnal |
fa1950 |
* Last one, %h, may be omitted (we can find it out).
|
|
Matej Habrnal |
fa1950 |
*/
|
|
Matej Habrnal |
fa1950 |
-static const char percent_specifiers[] = "%scpugteh";
|
|
Matej Habrnal |
fa1950 |
+static const char percent_specifiers[] = "%scpugtei";
|
|
Matej Habrnal |
fa1950 |
static char *core_basename = (char*) "core";
|
|
Matej Habrnal |
fa1950 |
/*
|
|
Matej Habrnal |
fa1950 |
* Used for error messages only.
|
|
Matej Habrnal |
fa1950 |
@@ -453,6 +458,24 @@ static int create_or_die(const char *filename, int user_core_fd)
|
|
Matej Habrnal |
fa1950 |
perror_msg_and_die("Can't open '%s'", filename);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
+static void create_core_backtrace(pid_t tid, const char *executable, int signal_no, const char *dd_path)
|
|
Matej Habrnal |
fa1950 |
+{
|
|
Matej Habrnal |
fa1950 |
+#ifdef ENABLE_DUMP_TIME_UNWIND
|
|
Matej Habrnal |
fa1950 |
+ if (g_verbose > 1)
|
|
Matej Habrnal |
fa1950 |
+ sr_debug_parser = true;
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ char *error_message = NULL;
|
|
Matej Habrnal |
fa1950 |
+ bool success = sr_abrt_create_core_stacktrace_from_core_hook(dd_path, tid, executable,
|
|
Matej Habrnal |
fa1950 |
+ signal_no, &error_message);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ if (!success)
|
|
Matej Habrnal |
fa1950 |
+ {
|
|
Matej Habrnal |
fa1950 |
+ log("Failed to create core_backtrace: %s", error_message);
|
|
Matej Habrnal |
fa1950 |
+ free(error_message);
|
|
Matej Habrnal |
fa1950 |
+ }
|
|
Matej Habrnal |
fa1950 |
+#endif /* ENABLE_DUMP_TIME_UNWIND */
|
|
Matej Habrnal |
fa1950 |
+}
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
static int create_user_core(int user_core_fd, pid_t pid, off_t ulimit_c)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
if (user_core_fd >= 0)
|
|
Matej Habrnal |
fa1950 |
@@ -493,9 +516,9 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
if (argc < 8)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
- /* percent specifier: %s %c %p %u %g %t %e %h */
|
|
Matej Habrnal |
fa1950 |
+ /* percent specifier: %s %c %p %u %g %t %e %i */
|
|
Matej Habrnal |
fa1950 |
/* argv: [0] [1] [2] [3] [4] [5] [6] [7] [8]*/
|
|
Matej Habrnal |
fa1950 |
- error_msg_and_die("Usage: %s SIGNO CORE_SIZE_LIMIT PID UID GID TIME BINARY_NAME [HOSTNAME]", argv[0]);
|
|
Matej Habrnal |
fa1950 |
+ error_msg_and_die("Usage: %s SIGNO CORE_SIZE_LIMIT PID UID GID TIME BINARY_NAME [TID]", argv[0]);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/* Not needed on 2.6.30.
|
|
Matej Habrnal |
fa1950 |
@@ -520,6 +543,8 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
/* ... and plugins/CCpp.conf */
|
|
Matej Habrnal |
fa1950 |
bool setting_MakeCompatCore;
|
|
Matej Habrnal |
fa1950 |
bool setting_SaveBinaryImage;
|
|
Matej Habrnal |
fa1950 |
+ bool setting_SaveFullCore;
|
|
Matej Habrnal |
fa1950 |
+ bool setting_CreateCoreBacktrace;
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
map_string_t *settings = new_map_string();
|
|
Matej Habrnal |
fa1950 |
load_abrt_plugin_conf_file("CCpp.conf", settings);
|
|
Matej Habrnal |
fa1950 |
@@ -528,6 +553,10 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
setting_MakeCompatCore = value && string_to_bool(value);
|
|
Matej Habrnal |
fa1950 |
value = get_map_string_item_or_NULL(settings, "SaveBinaryImage");
|
|
Matej Habrnal |
fa1950 |
setting_SaveBinaryImage = value && string_to_bool(value);
|
|
Matej Habrnal |
fa1950 |
+ value = get_map_string_item_or_NULL(settings, "SaveFullCore");
|
|
Matej Habrnal |
fa1950 |
+ setting_SaveFullCore = value ? string_to_bool(value) : true;
|
|
Matej Habrnal |
fa1950 |
+ value = get_map_string_item_or_NULL(settings, "CreateCoreBacktrace");
|
|
Matej Habrnal |
fa1950 |
+ setting_CreateCoreBacktrace = value ? string_to_bool(value) : true;
|
|
Matej Habrnal |
fa1950 |
value = get_map_string_item_or_NULL(settings, "VerboseLog");
|
|
Matej Habrnal |
fa1950 |
if (value)
|
|
Matej Habrnal |
fa1950 |
g_verbose = xatoi_positive(value);
|
|
Matej Habrnal |
fa1950 |
@@ -560,11 +589,10 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
free(s);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
- struct utsname uts;
|
|
Matej Habrnal |
fa1950 |
- if (!argv[8]) /* no HOSTNAME? */
|
|
Matej Habrnal |
fa1950 |
+ pid_t tid = 0;
|
|
Matej Habrnal |
fa1950 |
+ if (argv[8])
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
- uname(&uts;;
|
|
Matej Habrnal |
fa1950 |
- argv[8] = uts.nodename;
|
|
Matej Habrnal |
fa1950 |
+ tid = xatoi_positive(argv[8]);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
char path[PATH_MAX];
|
|
Matej Habrnal |
fa1950 |
@@ -769,49 +797,57 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
off_t sz = copyfd_eof(src_fd_binary, dst_fd, COPYFD_SPARSE);
|
|
Matej Habrnal |
fa1950 |
if (fsync(dst_fd) != 0 || close(dst_fd) != 0 || sz < 0)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
- dd_delete(dd);
|
|
Matej Habrnal |
fa1950 |
- error_msg_and_die("Error saving '%s'", path);
|
|
Matej Habrnal |
fa1950 |
+ dd_delete(dd); error_msg_and_die("Error saving '%s'", path);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
close(src_fd_binary);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
- strcpy(path + path_len, "/"FILENAME_COREDUMP);
|
|
Matej Habrnal |
fa1950 |
- int abrt_core_fd = create_or_die(path, user_core_fd);
|
|
Matej Habrnal |
fa1950 |
-
|
|
Matej Habrnal |
fa1950 |
- /* We write both coredumps at once.
|
|
Matej Habrnal |
fa1950 |
- * We can't write user coredump first, since it might be truncated
|
|
Matej Habrnal |
fa1950 |
- * and thus can't be copied and used as abrt coredump;
|
|
Matej Habrnal |
fa1950 |
- * and if we write abrt coredump first and then copy it as user one,
|
|
Matej Habrnal |
fa1950 |
- * then we have a race when process exits but coredump does not exist yet:
|
|
Matej Habrnal |
fa1950 |
- * $ echo -e '#include<signal.h>\nmain(){raise(SIGSEGV);}' | gcc -o test -x c -
|
|
Matej Habrnal |
fa1950 |
- * $ rm -f core*; ulimit -c unlimited; ./test; ls -l core*
|
|
Matej Habrnal |
fa1950 |
- * 21631 Segmentation fault (core dumped) ./test
|
|
Matej Habrnal |
fa1950 |
- * ls: cannot access core*: No such file or directory <=== BAD
|
|
Matej Habrnal |
fa1950 |
- */
|
|
Matej Habrnal |
fa1950 |
- off_t core_size = copyfd_sparse(STDIN_FILENO, abrt_core_fd, user_core_fd, ulimit_c);
|
|
Matej Habrnal |
fa1950 |
- if (fsync(abrt_core_fd) != 0 || close(abrt_core_fd) != 0 || core_size < 0)
|
|
Matej Habrnal |
fa1950 |
+ off_t core_size = 0;
|
|
Matej Habrnal |
fa1950 |
+ if (setting_SaveFullCore)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
- unlink(path);
|
|
Matej Habrnal |
fa1950 |
- dd_delete(dd);
|
|
Matej Habrnal |
fa1950 |
- if (user_core_fd >= 0)
|
|
Matej Habrnal |
fa1950 |
+ strcpy(path + path_len, "/"FILENAME_COREDUMP);
|
|
Matej Habrnal |
fa1950 |
+ int abrt_core_fd = create_or_die(path, user_core_fd);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ /* We write both coredumps at once.
|
|
Matej Habrnal |
fa1950 |
+ * We can't write user coredump first, since it might be truncated
|
|
Matej Habrnal |
fa1950 |
+ * and thus can't be copied and used as abrt coredump;
|
|
Matej Habrnal |
fa1950 |
+ * and if we write abrt coredump first and then copy it as user one,
|
|
Matej Habrnal |
fa1950 |
+ * then we have a race when process exits but coredump does not exist yet:
|
|
Matej Habrnal |
fa1950 |
+ * $ echo -e '#include<signal.h>\nmain(){raise(SIGSEGV);}' | gcc -o test -x c -
|
|
Matej Habrnal |
fa1950 |
+ * $ rm -f core*; ulimit -c unlimited; ./test; ls -l core*
|
|
Matej Habrnal |
fa1950 |
+ * 21631 Segmentation fault (core dumped) ./test
|
|
Matej Habrnal |
fa1950 |
+ * ls: cannot access core*: No such file or directory <=== BAD
|
|
Matej Habrnal |
fa1950 |
+ */
|
|
Matej Habrnal |
fa1950 |
+ core_size = copyfd_sparse(STDIN_FILENO, abrt_core_fd, user_core_fd, ulimit_c);
|
|
Matej Habrnal |
fa1950 |
+ if (fsync(abrt_core_fd) != 0 || close(abrt_core_fd) != 0 || core_size < 0)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
+ unlink(path);
|
|
Matej Habrnal |
fa1950 |
+ dd_delete(dd);
|
|
Matej Habrnal |
fa1950 |
+ if (user_core_fd >= 0)
|
|
Matej Habrnal |
fa1950 |
+ {
|
|
Matej Habrnal |
fa1950 |
+ xchdir(user_pwd);
|
|
Matej Habrnal |
fa1950 |
+ unlink(core_basename);
|
|
Matej Habrnal |
fa1950 |
+ }
|
|
Matej Habrnal |
fa1950 |
+ /* copyfd_sparse logs the error including errno string,
|
|
Matej Habrnal |
fa1950 |
+ * but it does not log file name */
|
|
Matej Habrnal |
fa1950 |
+ error_msg_and_die("Error writing '%s'", path);
|
|
Matej Habrnal |
fa1950 |
+ }
|
|
Matej Habrnal |
fa1950 |
+ if (user_core_fd >= 0
|
|
Matej Habrnal |
fa1950 |
+ /* error writing user coredump? */
|
|
Matej Habrnal |
fa1950 |
+ && (fsync(user_core_fd) != 0 || close(user_core_fd) != 0
|
|
Matej Habrnal |
fa1950 |
+ /* user coredump is too big? */
|
|
Matej Habrnal |
fa1950 |
+ || (ulimit_c == 0 /* paranoia */ || core_size > ulimit_c)
|
|
Matej Habrnal |
fa1950 |
+ )
|
|
Matej Habrnal |
fa1950 |
+ ) {
|
|
Matej Habrnal |
fa1950 |
+ /* nuke it (silently) */
|
|
Matej Habrnal |
fa1950 |
xchdir(user_pwd);
|
|
Matej Habrnal |
fa1950 |
unlink(core_basename);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
- /* copyfd_sparse logs the error including errno string,
|
|
Matej Habrnal |
fa1950 |
- * but it does not log file name */
|
|
Matej Habrnal |
fa1950 |
- error_msg_and_die("Error writing '%s'", path);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
- if (user_core_fd >= 0
|
|
Matej Habrnal |
fa1950 |
- /* error writing user coredump? */
|
|
Matej Habrnal |
fa1950 |
- && (fsync(user_core_fd) != 0 || close(user_core_fd) != 0
|
|
Matej Habrnal |
fa1950 |
- /* user coredump is too big? */
|
|
Matej Habrnal |
fa1950 |
- || (ulimit_c == 0 /* paranoia */ || core_size > ulimit_c)
|
|
Matej Habrnal |
fa1950 |
- )
|
|
Matej Habrnal |
fa1950 |
- ) {
|
|
Matej Habrnal |
fa1950 |
- /* nuke it (silently) */
|
|
Matej Habrnal |
fa1950 |
- xchdir(user_pwd);
|
|
Matej Habrnal |
fa1950 |
- unlink(core_basename);
|
|
Matej Habrnal |
fa1950 |
+ else
|
|
Matej Habrnal |
fa1950 |
+ {
|
|
Matej Habrnal |
fa1950 |
+ /* User core is created even if WriteFullCore is off. */
|
|
Matej Habrnal |
fa1950 |
+ create_user_core(user_core_fd, pid, ulimit_c);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/* Save JVM crash log if it exists. (JVM's coredump per se
|
|
Matej Habrnal |
fa1950 |
@@ -847,6 +883,10 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
+ /* Perform crash-time unwind of the guilty thread. */
|
|
Matej Habrnal |
fa1950 |
+ if (tid > 0 && setting_CreateCoreBacktrace)
|
|
Matej Habrnal |
fa1950 |
+ create_core_backtrace(tid, executable, signal_no, dd->dd_dirname);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
/* We close dumpdir before we start catering for crash storm case.
|
|
Matej Habrnal |
fa1950 |
* Otherwise, delete_dump_dir's from other concurrent
|
|
Matej Habrnal |
fa1950 |
* CCpp's won't be able to delete our dump (their delete_dump_dir
|
|
Matej Habrnal |
fa1950 |
@@ -860,7 +900,9 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
strcpy(path, newpath);
|
|
Matej Habrnal |
fa1950 |
free(newpath);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
- log_notice("Saved core dump of pid %lu (%s) to %s (%llu bytes)", (long)pid, executable, path, (long long)core_size);
|
|
Matej Habrnal |
fa1950 |
+ if (core_size > 0)
|
|
Matej Habrnal |
fa1950 |
+ log_notice("Saved core dump of pid %lu (%s) to %s (%llu bytes)",
|
|
Matej Habrnal |
fa1950 |
+ (long)pid, executable, path, (long long)core_size);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
notify_new_path(path);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
diff --git a/src/hooks/abrt-install-ccpp-hook.in b/src/hooks/abrt-install-ccpp-hook.in
|
|
Matej Habrnal |
fa1950 |
index aa01231..d4ed4a5 100755
|
|
Matej Habrnal |
fa1950 |
--- a/src/hooks/abrt-install-ccpp-hook.in
|
|
Matej Habrnal |
fa1950 |
+++ b/src/hooks/abrt-install-ccpp-hook.in
|
|
Matej Habrnal |
fa1950 |
@@ -11,9 +11,9 @@ SAVED_PATTERN_DIR="@VAR_RUN@/abrt"
|
|
Matej Habrnal |
fa1950 |
SAVED_PATTERN_FILE="@VAR_RUN@/abrt/saved_core_pattern"
|
|
Matej Habrnal |
fa1950 |
HOOK_BIN="@libexecdir@/abrt-hook-ccpp"
|
|
Matej Habrnal |
fa1950 |
# Must match percent_specifiers[] order in abrt-hook-ccpp.c:
|
|
Matej Habrnal |
fa1950 |
-PATTERN="|$HOOK_BIN %s %c %p %u %g %t %e"
|
|
Matej Habrnal |
fa1950 |
+PATTERN="|$HOOK_BIN %s %c %p %u %g %t %e %i"
|
|
Matej Habrnal |
fa1950 |
# Same, but with bogus "executable name" parameter
|
|
Matej Habrnal |
fa1950 |
-PATTERN1="|$HOOK_BIN %s %c %p %u %g %t e"
|
|
Matej Habrnal |
fa1950 |
+PATTERN1="|$HOOK_BIN %s %c %p %u %g %t e %i"
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
# core_pipe_limit specifies how many dump_helpers can run at the same time
|
|
Matej Habrnal |
fa1950 |
# 0 - means unlimited, but it's not guaranteed that /proc/<pid> of crashing
|
|
Matej Habrnal |
fa1950 |
--
|
|
Matej Habrnal |
fa1950 |
2.1.0
|
|
Matej Habrnal |
fa1950 |
|