def checkForCrashes(self, testName=None): """ Detects when a crash occurs and prints the output from MINIDUMP_STACKWALK. Returns true if crash detected, otherwise false. """ stackwalkPath = os.environ.get('MINIDUMP_STACKWALK', None) # try to get the caller's filename if no test name is given if testName is None: try: testName = os.path.basename(sys._getframe(1).f_code.co_filename) except: testName = "unknown" foundCrash = False dumpDir = os.path.join(self.profile.profile, 'minidumps') dumps = glob.glob(os.path.join(dumpDir, '*.dmp')) symbolsPath = self.options.symbolsPath for d in dumps: import subprocess foundCrash = True self.logger.info("PROCESS-CRASH | %s | application crashed (minidump found)", testName) print "Crash dump filename: " + d # only proceed if a symbols path and stackwalk path were specified if symbolsPath and stackwalkPath and os.path.exists(stackwalkPath): # if symbolsPath is a url, download and extract the zipfile if utils.isURL(symbolsPath): bundle = utils.download(symbolsPath, here) symbolsPath = os.path.join(os.path.dirname(bundle), 'symbols') utils.extract(bundle, symbolsPath, delete=True) # run minidump_stackwalk p = subprocess.Popen([stackwalkPath, d, symbolsPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE) (out, err) = p.communicate() if len(out) > 3: # minidump_stackwalk is chatty, so ignore stderr when it succeeds. print out else: print "stderr from minidump_stackwalk:" print err if p.returncode != 0: print "minidump_stackwalk exited with return code %d" % p.returncode else: self.logger.warning('No symbols_path or stackwalk path specified, can\'t process dump') break # if the symbols path was downloaded, cleanup after ourselves if utils.isURL(self.options.symbolsPath): if os.path.exists(symbolsPath): shutil.rmtree(symbolsPath) return foundCrash
def checkForCrashes(self, testName=None): """ Detects when a crash occurs and prints the output from MINIDUMP_STACKWALK. Returns true if crash detected, otherwise false. """ stackwalkPath = os.environ.get('MINIDUMP_STACKWALK', None) # try to get the caller's filename if no test name is given if testName is None: try: testName = os.path.basename(sys._getframe(1).f_code.co_filename) except: testName = "unknown" dumpDir = os.path.join(self.profile.profile, 'minidumps') dumps = glob.glob(os.path.join(dumpDir, '*.dmp')) if len(dumps) == 0: return False symbolsPath = self.options.symbolsPath for d in dumps: import subprocess self.logger.info("PROCESS-CRASH | %s | application crashed (minidump found)", testName) print "Crash dump filename: " + d # only proceed if a symbols path and stackwalk path were specified if symbolsPath and stackwalkPath and os.path.exists(stackwalkPath): # if symbolsPath is a url, download and extract the zipfile if utils.isURL(symbolsPath): bundle = utils.download(symbolsPath, here) symbolsPath = os.path.join(os.path.dirname(bundle), 'symbols') utils.extract(bundle, symbolsPath, delete=True) # run minidump_stackwalk p = subprocess.Popen([stackwalkPath, d, symbolsPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE) (out, err) = p.communicate() if len(out) > 3: # minidump_stackwalk is chatty, so ignore stderr when it succeeds. print out else: print "stderr from minidump_stackwalk:" print err if p.returncode != 0: print "minidump_stackwalk exited with return code %d" % p.returncode else: self.logger.warning('No symbols_path or stackwalk path specified, can\'t process dump') break # if the symbols path was downloaded, cleanup after ourselves if utils.isURL(self.options.symbolsPath): if os.path.exists(symbolsPath): shutil.rmtree(symbolsPath) return True