Bug 1240160: Add the TimeStamp based values to crash reports. r=ted draft
authorMilan Sreckovic <milan@mozilla.com>
Fri, 15 Jan 2016 15:39:25 -0500
changeset 322149 5ae3bf3fd7b6318ffab8642b5008031d5cf3ba44
parent 322148 d22ea6d364bc87de66a276ff71efd727259ea221
child 322150 32361f1472c54bffef1f767cc8be93bd87eef780
push id9537
push usermsreckovic@mozilla.com
push dateFri, 15 Jan 2016 21:12:38 +0000
reviewersted
bugs1240160
milestone46.0a1
Bug 1240160: Add the TimeStamp based values to crash reports. r=ted
toolkit/crashreporter/nsExceptionHandler.cpp
--- a/toolkit/crashreporter/nsExceptionHandler.cpp
+++ b/toolkit/crashreporter/nsExceptionHandler.cpp
@@ -8,16 +8,17 @@
 #include "nsDataHashtable.h"
 #include "mozilla/ArrayUtils.h"
 #include "mozilla/dom/CrashReporterChild.h"
 #include "mozilla/Services.h"
 #include "nsIObserverService.h"
 #include "mozilla/unused.h"
 #include "mozilla/Snprintf.h"
 #include "mozilla/SyncRunnable.h"
+#include "mozilla/TimeStamp.h"
 
 #include "nsThreadUtils.h"
 #include "nsXULAppAPI.h"
 #include "jsfriendapi.h"
 
 #if defined(XP_WIN32)
 #ifdef WIN32_LEAN_AND_MEAN
 #undef WIN32_LEAN_AND_MEAN
@@ -737,16 +738,22 @@ bool MinidumpCallback(
     XP_TTOA(timeSinceLastCrash, timeSinceLastCrashString, 10);
   }
   // write crash time to file
   if (lastCrashTimeFilename[0] != 0) {
     PlatformWriter lastCrashFile(lastCrashTimeFilename);
     WriteString(lastCrashFile, crashTimeString);
   }
 
+  bool ignored = false;
+  double crashTimeStamp = (TimeStamp::NowLoRes()-
+                           TimeStamp::ProcessCreation(ignored)).ToSecondsSigDigits();
+  char crashTimeStampString[32];
+  snprintf(crashTimeStampString, sizeof(crashTimeStampString)-1, "%f", crashTimeStamp);
+
   // Write crash event file.
 
   // Minidump IDs are UUIDs (36) + NULL.
   static char id_ascii[37];
 #ifdef XP_LINUX
   const char * index = strrchr(descriptor.path(), '/');
   MOZ_ASSERT(index);
   MOZ_ASSERT(strlen(index) == 1 + 36 + 4); // "/" + UUID + ".dmp"
@@ -788,16 +795,18 @@ bool MinidumpCallback(
     }
 
     if (!crashReporterAPIData->IsEmpty()) {
       // write out API data
       apiData.Open(extraDataPath);
       apiData.WriteBuffer(crashReporterAPIData->get(), crashReporterAPIData->Length());
     }
     WriteAnnotation(apiData, "CrashTime", crashTimeString);
+    WriteAnnotation(apiData, "CrashTimeStamp", crashTimeStampString);
+
     if (timeSinceLastCrash != 0) {
       WriteAnnotation(apiData, "SecondsSinceLastCrash",
                       timeSinceLastCrashString);
       WriteAnnotation(eventFile, "SecondsSinceLastCrash",
                       timeSinceLastCrashString);
     }
     if (isGarbageCollecting) {
       WriteAnnotation(apiData, "IsGarbageCollecting",
@@ -2572,16 +2581,26 @@ WriteExtraData(nsIFile* extraFile,
   if (writeCrashTime) {
     time_t crashTime = time(nullptr);
     char crashTimeString[32];
     XP_TTOA(crashTime, crashTimeString, 10);
 
     WriteAnnotation(fd,
                     nsDependentCString("CrashTime"),
                     nsDependentCString(crashTimeString));
+
+    bool ignored = false;
+    double crashTimeStamp = (TimeStamp::NowLoRes()-
+                             TimeStamp::ProcessCreation(ignored)).ToSecondsSigDigits();
+    char crashTimeStampString[32];
+    snprintf(crashTimeStampString, sizeof(crashTimeStampString)-1, "%f", crashTimeStamp);
+
+    WriteAnnotation(fd,
+                    nsDependentCString("CrashTimeStamp"),
+                    nsDependentCString(crashTimeStampString));
   }
 
   PR_Close(fd);
   return true;
 }
 
 bool
 AppendExtraData(nsIFile* extraFile, const AnnotationTable& data)