You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ap...@apache.org on 2007/03/29 09:27:59 UTC

svn commit: r523601 - in /harmony/enhanced/classlib/trunk/modules/portlib/src/main/native/port/windows: hysignal.c hysignal.h

Author: apetrenko
Date: Thu Mar 29 00:27:58 2007
New Revision: 523601

URL: http://svn.apache.org/viewvc?view=rev&rev=523601
Log:
Patch for HARMONY-3124 "[classlib][launcher] Generation of minidumps files on crash"

Modified:
    harmony/enhanced/classlib/trunk/modules/portlib/src/main/native/port/windows/hysignal.c
    harmony/enhanced/classlib/trunk/modules/portlib/src/main/native/port/windows/hysignal.h

Modified: harmony/enhanced/classlib/trunk/modules/portlib/src/main/native/port/windows/hysignal.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/portlib/src/main/native/port/windows/hysignal.c?view=diff&rev=523601&r1=523600&r2=523601
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/portlib/src/main/native/port/windows/hysignal.c (original)
+++ harmony/enhanced/classlib/trunk/modules/portlib/src/main/native/port/windows/hysignal.c Thu Mar 29 00:27:58 2007
@@ -23,6 +23,8 @@
 #endif /* HY_NO_THR */
 #include "hythread.h"
 #include "hysignal.h"
+#include <stdio.h>
+#include <DbgHelp.h>
 
 typedef struct HyWin32AsyncHandlerRecord
 {
@@ -319,6 +321,54 @@
 }
 
 #undef CDEV_CURRENT_FUNCTION
+static void
+genMiniDumpFile (EXCEPTION_POINTERS * exceptionInfo, char* dumpInfo)
+{
+  typedef BOOL (WINAPI * MINIDUMPPROC)(HANDLE /*hProcess*/, DWORD /*ProcessId*/,
+    HANDLE /*hFile*/, MINIDUMP_TYPE /*DumpType*/, PMINIDUMP_EXCEPTION_INFORMATION /*ExceptionParam*/,
+    PMINIDUMP_USER_STREAM_INFORMATION /*UserStreamParam*/, PMINIDUMP_CALLBACK_INFORMATION /*CallbackParam*/);
+  MINIDUMPPROC _MiniDumpWriteDump = NULL;
+  HANDLE dmpFile = 0;
+  DWORD uv = 0;
+  char dumpFileName[64] = {0};
+  HMODULE dbghLib = NULL;
+  BOOL res = FALSE;
+	MINIDUMP_EXCEPTION_INFORMATION mei;
+
+  dbghLib = LoadLibrary( "DBGHELP.DLL");
+  if (!dbghLib){
+    sprintf(dumpInfo, "Failed to load DbgHelp library.");
+    return;
+  }
+  _MiniDumpWriteDump = (MINIDUMPPROC)GetProcAddress(dbghLib, "MiniDumpWriteDump");
+  if (!_MiniDumpWriteDump){
+    sprintf(dumpInfo, "Failed to load DbgHelp library.");
+    return;
+  }
+
+  uv = GetTickCount();
+  sprintf(dumpFileName, "hydump_%d.dmp", uv);
+  dmpFile = CreateFile(dumpFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
+  if (dmpFile == INVALID_HANDLE_VALUE){
+    sprintf(dumpInfo, "Failed to create dump file: .%s", dumpFileName);
+    return;
+  }
+
+	mei.ThreadId = GetCurrentThreadId();
+	mei.ExceptionPointers = exceptionInfo;
+	mei.ClientPointers = TRUE;
+
+	res = _MiniDumpWriteDump( GetCurrentProcess(), GetCurrentProcessId(), dmpFile, MiniDumpNormal, &mei, 0, 0 );
+  if (!res){
+    sprintf(dumpInfo, "Failed generate dump file.");
+  }
+  else{
+    char dir[_MAX_PATH] = {0};
+    GetCurrentDirectory( _MAX_PATH, dir);
+    sprintf(dumpInfo, "%s\\%s", dir, dumpFileName);
+  }
+	CloseHandle(dmpFile);
+}
 
 #define CDEV_CURRENT_FUNCTION structuredExceptionHandler
 int
@@ -433,7 +483,7 @@
   hyinfo->handlerAddress2 = (void *) structuredExceptionHandler;
   hyinfo->ExceptionRecord = exceptionInfo->ExceptionRecord;
   hyinfo->ContextRecord = exceptionInfo->ContextRecord;
-
+  genMiniDumpFile(exceptionInfo, hyinfo->dumpInfo);
   /* module info is filled on demand */
 }
 
@@ -668,6 +718,10 @@
       *name = "Offset_in_DLL";
       *value = &info->offsetInDLL;
       return HYPORT_SIG_VALUE_32;
+    case 3:
+      *name = "Dumpfile";
+      *value = &info->dumpInfo;
+      return HYPORT_SIG_VALUE_STRING;
     default:
       return HYPORT_SIG_VALUE_UNDEFINED;
     }

Modified: harmony/enhanced/classlib/trunk/modules/portlib/src/main/native/port/windows/hysignal.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/portlib/src/main/native/port/windows/hysignal.h?view=diff&rev=523601&r1=523600&r2=523601
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/portlib/src/main/native/port/windows/hysignal.h (original)
+++ harmony/enhanced/classlib/trunk/modules/portlib/src/main/native/port/windows/hysignal.h Thu Mar 29 00:27:58 2007
@@ -30,6 +30,7 @@
   void *moduleBaseAddress;
   U_32 offsetInDLL;
   char moduleName[_MAX_PATH];
+  char dumpInfo[_MAX_PATH];
 } HyWin32SignalInfo;
 
 #endif /* hysignal_h */