Add timestamp from core
authorTim Pepper <timothy.c.pepper@linux.intel.com>
Fri, 28 Sep 2012 00:22:15 +0000 (17:22 -0700)
committerTim Pepper <timothy.c.pepper@linux.intel.com>
Fri, 28 Sep 2012 00:22:15 +0000 (17:22 -0700)
The server has been attributing a timestamp to a crash report based on the
time the report is received.  This may differ greatly from the actual time
of the issue.  This is easily fixed with a stat of the corefile.

Unfortunately, the same can't as easily be done for getting the os-build,
which may also be incorrectly attributed on the client side based on the
/etc/os-release file's contents at the time of a crash's processing by
corewatcher, as opposed to at the actual time of the crash.

Tracking the combination of the reported os_build, core time, and receiving
time should give us more rich reporting and ability to discern problems
between different classes of users (eg: more/less network connectedness,
more/less aggressive adoption of updates).

Signed-off-by: Tim Pepper <timothy.c.pepper@linux.intel.com>
src/coredump.c

index b967069..76d20de 100644 (file)
@@ -321,16 +321,26 @@ static struct oops *extract_core(char *fullpath, char *appfile)
 {
        struct oops *oops = NULL;
        int ret = 0;
-       char *command = NULL, *h1 = NULL, *c1 = NULL, *c2 = NULL, *line = NULL, *text = NULL, *at = NULL;
+       char *command = NULL, *h1 = NULL, *c1 = NULL, *c2 = NULL, *line = NULL;
+       char *text = NULL, *at = NULL, *coretime = NULL;
        char *m1 = NULL, *m2 = NULL;
        FILE *file = NULL;
        char *badchar = NULL;
        char *release = get_release();
        int parsing_maps = 0;
+       struct stat stat_buf;
 
        if (asprintf(&command, "LANG=C gdb --batch -f %s %s -x /etc/corewatcher/gdb.command 2> /dev/null", appfile, fullpath) == -1)
                return NULL;
 
+       if (stat(fullpath, &stat_buf) != -1) {
+               coretime = ctime(&stat_buf.st_mtime);
+       }
+       if (coretime == NULL) {
+               if (asprintf(&coretime, "Unknown\n") == -1)
+                       return NULL;
+       }
+
        if ((at = wrapper_scan(command))) {
                free(appfile);
                appfile = at;
@@ -338,9 +348,11 @@ static struct oops *extract_core(char *fullpath, char *appfile)
 
        ret = asprintf(&h1,
                       "cmdline: %s\n"
-                      "release: %s\n",
+                      "release: %s\n"
+                      "time: %s",
                       appfile,
-                      release);
+                      release,
+                      coretime);
        free(release);
        if (ret == -1)
                h1 = strdup("Unknown");