[Vm-dev] [commit] r2153 - - Better handling of fatal errors.

commits at squeakvm.org commits at squeakvm.org
Thu Mar 11 07:15:37 UTC 2010


Author: andreas
Date: 2010-03-10 23:15:34 -0800 (Wed, 10 Mar 2010)
New Revision: 2153

Modified:
   trunk/platforms/win32/vm/sqPlatformSpecific.h
   trunk/platforms/win32/vm/sqWin32.h
   trunk/platforms/win32/vm/sqWin32Intel.c
   trunk/platforms/win32/vm/sqWin32Prefs.c
Log:
- Better handling of fatal errors.
- Make VM version a Makefile property


Modified: trunk/platforms/win32/vm/sqPlatformSpecific.h
===================================================================
--- trunk/platforms/win32/vm/sqPlatformSpecific.h	2010-03-10 19:22:45 UTC (rev 2152)
+++ trunk/platforms/win32/vm/sqPlatformSpecific.h	2010-03-11 07:15:34 UTC (rev 2153)
@@ -21,6 +21,9 @@
 #define squeakFileOffsetType unsigned long long
 #endif
 
+#undef error
+#define error(str) ioFatalError(str)
+
 #ifdef WIN32_FILE_SUPPORT
 
 #undef sqImageFile

Modified: trunk/platforms/win32/vm/sqWin32.h
===================================================================
--- trunk/platforms/win32/vm/sqWin32.h	2010-03-10 19:22:45 UTC (rev 2152)
+++ trunk/platforms/win32/vm/sqWin32.h	2010-03-11 07:15:34 UTC (rev 2153)
@@ -241,9 +241,16 @@
 #define VERSION ""
 #endif
 
-#define VM_VERSION TEXT("Squeak 3.11.5 (beta) from ") TEXT(__DATE__) \
-	TEXT("\n") TEXT("Compiler: ") TEXT(COMPILER) TEXT(VERSION)
+/* Ensure that VM_VERSION (3.11.5 etc) is defined */
+#ifndef VM_VERSION
+#error "VM_VERSION is undefined"
+#endif
+#ifndef VM_NAME
+#error "VM_NAME is undefined"
+#endif
 
+#define VM_VERSION_INFO TEXT(VM_NAME) TEXT(VM_VERSION) TEXT(" from ") TEXT(__DATE__) \
+
 /********************************************************/
 /* image reversal functions                             */
 /********************************************************/

Modified: trunk/platforms/win32/vm/sqWin32Intel.c
===================================================================
--- trunk/platforms/win32/vm/sqWin32Intel.c	2010-03-10 19:22:45 UTC (rev 2152)
+++ trunk/platforms/win32/vm/sqWin32Intel.c	2010-03-11 07:15:34 UTC (rev 2153)
@@ -697,6 +697,86 @@
 /*                      Release                                             */
 /****************************************************************************/
 
+void
+printCommonCrashDumpInfo(FILE *f) {
+
+    fprintf(f,"\n\n%s", hwInfoString);
+    fprintf(f,"\n%s", osInfoString);
+    fprintf(f,"\n%s", gdInfoString);
+
+    /* print VM version information */
+    fprintf(f,"\nVM Version: %s\n", VM_VERSION_INFO);
+    fflush(f);
+    fprintf(f,"\n"
+	    "Current byte code: %d\n"
+	    "Primitive index: %d\n",
+	    getCurrentBytecode(),
+	    methodPrimitiveIndex());
+    fflush(f);
+    /* print loaded plugins */
+    fprintf(f,"\nLoaded plugins:\n");
+    {
+      int index = 1;
+      char *pluginName;
+      while( (pluginName = ioListLoadedModule(index)) != NULL) {
+	fprintf(f,"\t%s\n", pluginName);
+	fflush(f);
+	index++;
+      }
+    }
+	/* print the caller's stack to "crash.dmp" */
+    fprintf(f,"\nThe Smalltalk Stack:\n");
+    {
+	  FILE tmpStdout;
+	  tmpStdout = *stdout;
+	  *stdout = *f;
+	  printCallStack();
+	  *f = *stdout;
+	  *stdout = tmpStdout;
+	  fprintf(f,"\n");
+    }
+}
+
+void
+error(char *msg) {
+  FILE *f;
+  TCHAR crashInfo[1024];
+
+    wsprintf(crashInfo,
+	   TEXT("Sorry but the VM has crashed.\n\n")
+	   TEXT("Reason: %s\n\n")
+	   TEXT("Current byte code: %d\n")
+	   TEXT("Primitive index: %d\n\n")
+	   TEXT("This information will be stored in the file\n")
+	   TEXT("%s\\%s\n")
+	   TEXT("with a complete stack dump"),
+	   msg,
+	   getCurrentBytecode(),
+	   methodPrimitiveIndex(),
+	   vmPath,
+	   TEXT("crash.dmp"));
+  if(!fHeadlessImage)
+    MessageBox(stWindow,crashInfo,TEXT("Fatal VM error"),
+                 MB_OK | MB_APPLMODAL | MB_ICONSTOP);
+
+  SetCurrentDirectory(vmPath);
+  /* print the above information */
+  f = fopen("crash.dmp","a");
+  if(f){  
+    time_t crashTime = time(NULL);
+    fprintf(f,"---------------------------------------------------------------------\n");
+    fprintf(f,"%s\n\n", ctime(&crashTime));
+
+	fprintf(f,"Reason: %s\n", msg);
+	printCommonCrashDumpInfo(f);
+	fclose(f);
+  }
+  /* print the caller's stack to stdout */
+  printCallStack();
+  exit(-1);
+}
+
+
 void printCrashDebugInformation(LPEXCEPTION_POINTERS exp)
 { TCHAR crashInfo[1024];
   FILE *f;
@@ -731,7 +811,7 @@
                      vmPath,
                      TEXT("crash.dmp"));
   if(!fHeadlessImage)
-    MessageBox(0,crashInfo,TEXT("Fatal VM error"),
+    MessageBox(stWindow,crashInfo,TEXT("Fatal VM error"),
                  MB_OK | MB_APPLMODAL | MB_ICONSTOP);
 
   SetCurrentDirectory(vmPath);
@@ -769,46 +849,12 @@
 	    exp->ContextRecord->FloatSave.StatusWord,
 	    exp->ContextRecord->FloatSave.TagWord);
 
-    fprintf(f,"\n%s", hwInfoString);
-    fprintf(f,"\n%s", osInfoString);
-    fprintf(f,"\n%s", gdInfoString);
+	printCommonCrashDumpInfo(f);
+	fclose(f);
 
-    /* print VM version information */
-    fprintf(f,"\nVM Version: %s\n", VM_VERSION);
-    fflush(f);
-    fprintf(f,"\n"
-	    "Current byte code: %d\n"
-	    "Primitive index: %d\n",
-	    byteCode,
-	    methodPrimitiveIndex());
-    fflush(f);
-    /* print loaded plugins */
-    fprintf(f,"\nLoaded plugins:\n");
-    {
-      int index = 1;
-      char *pluginName;
-      while( (pluginName = ioListLoadedModule(index)) != NULL) {
-	fprintf(f,"\t%s\n", pluginName);
-	fflush(f);
-	index++;
-      }
-    }
-    fprintf(f, "\n\nStack dump:\n\n");
+    /* print the caller's stack twice (to stdout and "crash.dmp")*/
+	printCallStack();
   }
-  fflush(f);
-
-  /* print the caller's stack twice (to stdout and "crash.dmp")*/
-  {
-	  FILE tmpStdout;
-	  tmpStdout = *stdout;
-	  *stdout = *f;
-	  printCallStack();
-	  *f = *stdout;
-	  *stdout = tmpStdout;
-	  fprintf(f,"\n");
-	  fclose(f);
-  }
-
   } EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
     /* that's to bad ... */
     if(!fHeadlessImage)
@@ -819,42 +865,11 @@
   }
 }
 
-void printErrors()
-{ TCHAR *errorMsg;
-  fpos_t stdoutSize,stderrSize;
-
-  if(*stdoutName)
-    {
-      fgetpos(stdout,&stdoutSize);
-      fseek(stdout,0,SEEK_SET);
-    }
-  else stdoutSize = 0;
-
-  if(*stderrName)
-    {
-      fgetpos(stderr,&stderrSize);
-      fseek(stderr,0,SEEK_SET);
-    }
-  else stderrSize = 0;
-
-  if(stdoutSize <= 0 && stderrSize <= 0) return;
-  errorMsg = (char*) calloc((int)(stdoutSize+stderrSize+2),1);
-  fread(errorMsg,(int)stdoutSize,1,stdout);
-  errorMsg[stdoutSize] = '\n';
-  fread(&errorMsg[(int)(stdoutSize+1)],(int)stderrSize,1,stderr);
-  if(!fHeadlessImage)
-    MessageBox(0,errorMsg,TEXT("Error:"),MB_OK);
-  free(errorMsg);
-}
-
 extern int inCleanExit;
 
 void __cdecl Cleanup(void)
 { /* not all of these are essential, but they're polite... */
 
-  if(!inCleanExit) {
-    printCallStack();
-  }
   ioShutdownAllModules();
 #ifndef NO_PLUGIN_SUPPORT
   pluginExit();
@@ -868,8 +883,6 @@
   PROFILE_SHOW(ticksForReversal);
   PROFILE_SHOW(ticksForBlitting);
   /* Show errors only if not in a browser */
-  if(!browserWindow)
-	  printErrors();
   if(*stderrName)
     {
       fclose(stderr);

Modified: trunk/platforms/win32/vm/sqWin32Prefs.c
===================================================================
--- trunk/platforms/win32/vm/sqWin32Prefs.c	2010-03-10 19:22:45 UTC (rev 2152)
+++ trunk/platforms/win32/vm/sqWin32Prefs.c	2010-03-11 07:15:34 UTC (rev 2153)
@@ -348,7 +348,7 @@
 void HandlePrefsMenu(int cmd) {
   switch(cmd) {
   case ID_ABOUT: 
-    MessageBox(stWindow,VM_VERSION,
+    MessageBox(stWindow,VM_VERSION_INFO,
 	       TEXT("About " VM_NAME " on Win32"), MB_OK);
     break;
   case ID_DEFERUPDATES:



More information about the Vm-dev mailing list