Merge branch 'set_terminate' of git://github.com/gmoudry/ninja into minidump
authorEvan Martin <martine@danga.com>
Fri, 27 Jul 2012 18:44:06 +0000 (11:44 -0700)
committerEvan Martin <martine@danga.com>
Fri, 27 Jul 2012 18:44:06 +0000 (11:44 -0700)
(This likely doesn't compile, just getting all the history in place.)

Conflicts:
src/util.cc

1  2 
src/ninja.cc
src/util.cc
src/util.h

diff --cc src/ninja.cc
Simple merge
diff --cc src/util.cc
@@@ -283,31 -294,79 +284,109 @@@ string StripAnsiEscapeCodes(const strin
    return stripped;
  }
  
 +#ifdef _WIN32
 +static double GetLoadAverage_win32()
 +{
 +  // TODO(nicolas.despres@gmail.com): Find a way to implement it on Windows.
 +  return -0.0f;
 +}
 +#else
 +static double GetLoadAverage_unix()
 +{
 +  double loadavg[3] = { 0.0f, 0.0f, 0.0f };
 +  if (getloadavg(loadavg, 3) < 0)
 +  {
 +    // Maybe we should return an error here or the availability of
 +    // getloadavg(3) should be checked when ninja is configured.
 +    return -0.0f;
 +  }
 +  return loadavg[0];
 +}
 +#endif // _WIN32
 +
 +double GetLoadAverage()
 +{
 +#ifdef _WIN32
 +  return GetLoadAverage_win32();
 +#else
 +  return GetLoadAverage_unix();
 +#endif // _WIN32
 +}
++
+ #ifdef _MSC_VER\r
+ typedef BOOL (WINAPI *MiniDumpWriteDumpFunc) (\r
+     IN HANDLE,\r
+     IN DWORD,\r
+     IN HANDLE,\r
+     IN MINIDUMP_TYPE,\r
+     IN CONST PMINIDUMP_EXCEPTION_INFORMATION, OPTIONAL\r
+     IN CONST PMINIDUMP_USER_STREAM_INFORMATION, OPTIONAL\r
+     IN CONST PMINIDUMP_CALLBACK_INFORMATION OPTIONAL\r
+     );\r
\r
+ /// this function creates a windows minidump in temp folder.\r
+ void Create_Win32_MiniDump( _EXCEPTION_POINTERS* pep ) {\r
+   char tempPathBuff[MAX_PATH];\r
+   GetTempPath(sizeof(tempPathBuff), tempPathBuff);\r
+   char tempFileName[MAX_PATH];\r
+   sprintf(tempFileName, "%s\\ninja_crash_dump_%d.dmp", tempPathBuff, GetCurrentProcessId());\r
\r
+   //delete any previous minidump of the same name\r
+   DeleteFile(tempFileName);\r
\r
+   // load DbgHelp.dll dynamically, as library is not present on all windows versions\r
+   HMODULE hModDbgHelp = LoadLibrary("dbghelp.dll"); \r
+   if (hModDbgHelp == NULL) {\r
+     fprintf(stderr, "ninja: failed to create minidump, failed to load dbghelp.dll, error %s \n", 
+             GetLastErrorString().c_str());\r
+     return;\r
+   }\r
\r
+   MiniDumpWriteDumpFunc pfnMiniDumpWriteDump = (MiniDumpWriteDumpFunc)GetProcAddress(hModDbgHelp, "MiniDumpWriteDump");\r
+   if (pfnMiniDumpWriteDump == NULL) {\r
+     fprintf(stderr, "ninja: failed to create minidump, failed on GetProcAddress('MiniDumpWriteDump'), error %s \n", 
+             GetLastErrorString().c_str());\r
+     return;\r
+   }\r
\r
+   // Open the file \r
+   HANDLE hFile = CreateFileA( tempFileName, GENERIC_READ | GENERIC_WRITE, \r
+                      0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); \r
+   if (hFile == NULL) {\r
+     fprintf(stderr, "ninja: failed to create minidump, failed on CreateFileA(%s), error %s \n", 
+             tempFileName, GetLastErrorString().c_str());\r
+     return;\r
+   }\r
\r
+   // Create the mini dump \r
+   MINIDUMP_EXCEPTION_INFORMATION mdei; \r
+   mdei.ThreadId           = GetCurrentThreadId(); \r
+   mdei.ExceptionPointers  = pep;\r
+   mdei.ClientPointers     = FALSE; \r
+   MINIDUMP_TYPE mdt       = (MINIDUMP_TYPE) (MiniDumpWithDataSegs | MiniDumpWithHandleData);\r
\r
+   BOOL rv = pfnMiniDumpWriteDump( GetCurrentProcess(), GetCurrentProcessId(), \r
+                    hFile, mdt, (pep != 0) ? &mdei : 0, 0, 0 ); \r
\r
+   if ( !rv ) \r
+     fprintf(stderr, "ninja: MiniDumpWriteDump failed. Error: %s \n", GetLastErrorString().c_str() );\r
+   else \r
+     fprintf(stderr, "ninja: Minidump created: %s\n", tempFileName );\r
\r
+   // Close the file \r
+   CloseHandle( hFile ); \r
+ }\r
\r
+ /// On Windows, we want to prevent error dialogs in case of exceptions.\r
+ /// This function handles the exception, and writes a minidump.\r
+ int exception_filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {\r
+   fprintf(stderr, "ninja.exe fatal error: 0x%X \n", code);  //e.g. EXCEPTION_ACCESS_VIOLATION
+   fflush(stderr);
+   Create_Win32_MiniDump(ep);
+   return EXCEPTION_EXECUTE_HANDLER; \r
+ } \r
+ #else \r
+   //on Linux or MinGW, core dumps are created automatically, no code needed\r
+ #endif\r
\r
++
diff --cc src/util.h
Simple merge