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