Index: tools/utils.py |
diff --git a/tools/utils.py b/tools/utils.py |
index b89d227d7d59a53df4f5931e3f5a84613fe37d4e..f489f0db858ba59fd5cab3a670c3d0cf3b5ab010 100644 |
--- a/tools/utils.py |
+++ b/tools/utils.py |
@@ -700,7 +700,7 @@ class UnexpectedCrash(object): |
self.binary = binary |
def __str__(self): |
- return "%s: %s %s" % (self.test, self.binary, self.pid) |
+ return "Crash(%s: %s %s)" % (self.test, self.binary, self.pid) |
class SiteConfigBotoFileDisabler(object): |
def __init__(self): |
@@ -831,9 +831,10 @@ class BaseCoreDumpArchiver(object): |
# test.dart will write a line for each unexpected crash into this file. |
_UNEXPECTED_CRASHES_FILE = "unexpected-crashes" |
- def __init__(self): |
+ def __init__(self, search_dir): |
self._bucket = 'dart-temp-crash-archive' |
self._binaries_dir = os.getcwd() |
+ self._search_dir = search_dir |
def __enter__(self): |
# Cleanup any stale files |
@@ -871,9 +872,20 @@ class BaseCoreDumpArchiver(object): |
else: |
missing.append(crash) |
self._upload(files) |
+ |
if missing: |
- raise Exception('Missing crash dumps for: %s' % ', '.join( |
- [str(c) for c in missing])) |
+ self._report_missing_crashes(missing, throw=True) |
+ |
+ def _report_missing_crashes(self, missing, throw=True): |
+ missing_as_string = ', '.join([str(c) for c in missing]) |
+ other_files = list(glob.glob(os.path.join(self._search_dir, '*'))) |
+ print >> sys.stderr, ( |
+ "Could not find crash dumps for '%s' in search directory '%s'.\n" |
+ "Existing files which *did not* match the pattern inside the search " |
+ "directory are are:\n %s" |
+ % (missing_as_string, self._search_dir, '\n '.join(other_files))) |
+ if throw: |
+ raise Exception('Missing crash dumps for: %s' % missing_as_string) |
def _upload(self, files): |
bot_utils = GetBotUtils() |
@@ -934,8 +946,7 @@ class BaseCoreDumpArchiver(object): |
class LinuxCoreDumpArchiver(BaseCoreDumpArchiver): |
def __init__(self): |
- super(self.__class__, self).__init__() |
- self._search_dir = os.getcwd() |
+ super(self.__class__, self).__init__(os.getcwd()) |
def _cleanup(self): |
found = super(self.__class__, self)._cleanup() |
@@ -951,9 +962,8 @@ class LinuxCoreDumpArchiver(BaseCoreDumpArchiver): |
class WindowsCoreDumpArchiver(BaseCoreDumpArchiver): |
def __init__(self): |
- super(self.__class__, self).__init__() |
- self._search_dir = os.path.join( |
- os.getcwd(), WindowsCoredumpEnabler.WINDOWS_COREDUMP_FOLDER) |
+ super(self.__class__, self).__init__(os.path.join( |
+ os.getcwd(), WindowsCoredumpEnabler.WINDOWS_COREDUMP_FOLDER)) |
def _cleanup(self): |
found = super(self.__class__, self)._cleanup() |
@@ -967,6 +977,34 @@ class WindowsCoreDumpArchiver(BaseCoreDumpArchiver): |
for core_filename in glob.glob(pattern): |
return core_filename |
+ def _report_missing_crashes(self, missing, throw=True): |
+ # Let's only print the debugging information and not throw. We'll do more |
+ # validation for werfault.exe and throw afterwards. |
+ super(self.__class__, self)._report_missing_crashes(missing, throw=False) |
+ |
+ # Let's check again for the image execution options for werfault. Maybe |
+ # puppet came a long during testing and reverted our change. |
+ try: |
+ import winreg |
+ except ImportError: |
+ import _winreg as winreg |
+ for wowbit in [winreg.KEY_WOW64_64KEY, winreg.KEY_WOW64_32KEY]: |
+ try: |
+ with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, |
+ WindowsCoredumpEnabler.IMGEXEC_NAME, |
+ 0, |
+ winreg.KEY_READ | wowbit) as handle: |
+ raise Exception( |
+ "Found werfault.exe was disabled. Probably by puppet. Too bad") |
+ except OSError: |
+ # If the open did not work the werfault.exe execution setting is as it |
+ # should be. |
+ pass |
+ |
+ if throw: |
+ missing_as_string = ', '.join([str(c) for c in missing]) |
+ raise Exception('Missing crash dumps for: %s' % missing_as_string) |
+ |
@contextlib.contextmanager |
def NooptCoreDumpArchiver(): |
yield |