Author: [EMAIL PROTECTED]
Date: Wed Oct 29 02:52:31 2008
New Revision: 633

Modified:
    branches/bleeding_edge/src/platform-win32.cc
    branches/bleeding_edge/tools/test.py

Log:
By default disable the general protection fault message box when
running tests on Windows. This requires

Added the option --win-error-box to enable general protection fault
message box which can be convenient when debugging failing tests on
Windows.

Added crash detection when running tests on Windows. The output
is not fully polished but crashed indications are printed for the
different progess indicators.

Changed the OS::Abort on Windows from generating a "crash" (int3)
to calling abort(). This is to avoid tests which are known to fail
with out of memory errors to be detected as crashed tests.
Review URL: http://codereview.chromium.org/8676

Modified: branches/bleeding_edge/src/platform-win32.cc
==============================================================================
--- branches/bleeding_edge/src/platform-win32.cc        (original)
+++ branches/bleeding_edge/src/platform-win32.cc        Wed Oct 29 02:52:31 2008
@@ -781,9 +781,10 @@


  void OS::Abort() {
-  // Redirect to windows specific abort to ensure
-  // collaboration with sandboxing.
-  __debugbreak();
+  // Make the MSVCRT do a silent abort.
+  _set_abort_behavior(0, _WRITE_ABORT_MSG);
+  _set_abort_behavior(0, _CALL_REPORTFAULT);
+  abort();
  }



Modified: branches/bleeding_edge/tools/test.py
==============================================================================
--- branches/bleeding_edge/tools/test.py        (original)
+++ branches/bleeding_edge/tools/test.py        Wed Oct 29 02:52:31 2008
@@ -63,6 +63,7 @@
      self.remaining = len(cases)
      self.total = len(cases)
      self.failed = [ ]
+    self.crashed = 0
      self.terminate = False
      self.lock = threading.Lock()

@@ -124,6 +125,8 @@
        self.lock.acquire()
        if output.UnexpectedOutput():
          self.failed.append(output)
+        if output.HasCrashed():
+          self.crashed += 1
        else:
          self.succeeded += 1
        self.remaining -= 1
@@ -159,6 +162,8 @@
          print "--- stdout ---"
          print failed.output.stdout.strip()
        print "Command: %s" % EscapeCommand(failed.command)
+      if failed.HasCrashed():
+        print "--- CRASHED ---"
      if len(self.failed) == 0:
        print "==="
        print "=== All tests succeeded"
@@ -167,6 +172,8 @@
        print
        print "==="
        print "=== %i tests failed" % len(self.failed)
+      if self.crashed > 0:
+        print "=== %i tests CRASHED" % self.crashed
        print "==="


@@ -178,7 +185,10 @@

    def HasRun(self, output):
      if output.UnexpectedOutput():
-      outcome = 'FAIL'
+      if output.HasCrashed():
+        outcome = 'CRASH'
+      else:
+        outcome = 'FAIL'
      else:
        outcome = 'pass'
      print 'Done running %s: %s' % (output.test.GetLabel(), outcome)
@@ -194,8 +204,12 @@
      if (total > 1) and (total % 50 == 1):
        sys.stdout.write('\n')
      if output.UnexpectedOutput():
-      sys.stdout.write('F')
-      sys.stdout.flush()
+      if output.HasCrashed():
+        sys.stdout.write('C')
+        sys.stdout.flush()
+      else:
+        sys.stdout.write('F')
+        sys.stdout.flush()
      else:
        sys.stdout.write('.')
        sys.stdout.flush()
@@ -229,6 +243,8 @@
        if len(stderr):
          print self.templates['stderr'] % stderr
        print "Command: %s" % EscapeCommand(output.command)
+      if output.HasCrashed():
+        print "--- CRASHED ---"

    def Truncate(self, str, length):
      if length and (len(str) > (length - 3)):
@@ -344,12 +360,20 @@
      self.output = output

    def UnexpectedOutput(self):
-    if self.HasFailed():
+    if self.HasCrashed():
+      outcome = CRASH
+    elif self.HasFailed():
        outcome = FAIL
      else:
        outcome = PASS
      return not outcome in self.test.outcomes

+  def HasCrashed(self):
+    if platform.system() == 'Windows':
+      return 0x80000000 & self.output.exit_code and not (0x3FFFFF00 &  
self.output.exit_code)
+    else:
+      return False
+
    def HasFailed(self):
      execution_failed = self.test.DidFail(self.output)
      if self.test.IsNegative():
@@ -369,17 +393,34 @@
  INITIAL_SLEEP_TIME = 0.0001
  SLEEP_TIME_FACTOR = 1.25

+SEM_INVALID_VALUE = -1
+SEM_NOGPFAULTERRORBOX = 0x0002 # Microsoft Platform SDK WinBase.h

+def Win32SetErrorMode(mode):
+  prev_error_mode = SEM_INVALID_VALUE
+  try:
+    import ctypes
+    prev_error_mode = ctypes.windll.kernel32.SetErrorMode(mode);
+  except ImportError:
+    pass
+  return prev_error_mode
+
  def RunProcess(context, timeout, args, **rest):
    if context.verbose: print "#", " ".join(args)
    popen_args = args
+  prev_error_mode = SEM_INVALID_VALUE;
    if platform.system() == 'Windows':
      popen_args = '"' + subprocess.list2cmdline(args) + '"'
+    if context.supress_dialogs:
+      # Try to change the error mode to avoid dialogs on fatal errors.
+      Win32SetErrorMode(SEM_NOGPFAULTERRORBOX)
    process = subprocess.Popen(
      shell = (platform.system() == 'Windows'),
      args = popen_args,
      **rest
    )
+  if platform.system() == 'Windows' and context.supress_dialogs and  
prev_error_mode != SEM_INVALID_VALUE:
+    Win32SetErrorMode(prev_error_mode)
    # Compute the end time - if the process crosses this limit we
    # consider it timed out.
    if timeout is None: end_time = None
@@ -543,13 +584,14 @@

  class Context(object):

-  def __init__(self, workspace, buildspace, verbose, vm, timeout,  
processor):
+  def __init__(self, workspace, buildspace, verbose, vm, timeout,  
processor, supress_dialogs):
      self.workspace = workspace
      self.buildspace = buildspace
      self.verbose = verbose
      self.vm_root = vm
      self.timeout = timeout
      self.processor = processor
+    self.supress_dialogs = supress_dialogs

    def GetVm(self, mode):
      name = self.vm_root + PREFIX[mode]
@@ -1030,6 +1072,11 @@
        default=1, type="int")
    result.add_option("--time", help="Print timing information after  
running",
        default=False, action="store_true")
+  if platform.system() == 'Windows':
+    result.add_option("--supress-dialogs", help="Supress Windows dialogs  
for crashing tests",
+        dest="supress_dialogs", default=True, action="store_true")
+    result.add_option("--no-supress-dialogs", help="Display Windows  
dialogs for crashing tests",
+        dest="supress_dialogs", action="store_false")
    return result


@@ -1159,7 +1206,8 @@
    context = Context(workspace, buildspace, VERBOSE,
                      join(buildspace, 'shell'),
                      options.timeout,
-                    GetSpecialCommandProcessor(options.special_command))
+                    GetSpecialCommandProcessor(options.special_command),
+                    options.supress_dialogs)
    if options.j != 1:
      options.scons_flags += ['-j', str(options.j)]
    if not options.no_build:

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to