Chromium Code Reviews| Index: content/shell/tools/breakpad_integration_test.py |
| diff --git a/content/shell/tools/breakpad_integration_test.py b/content/shell/tools/breakpad_integration_test.py |
| index 9e31ad710acd836c9ea432567c834edffe065f49..d34b11652d7020303d4b23444ad77c4c3b815786 100755 |
| --- a/content/shell/tools/breakpad_integration_test.py |
| +++ b/content/shell/tools/breakpad_integration_test.py |
| @@ -57,24 +57,36 @@ def main(): |
| # Create a temporary directory to store the crash dumps and symbols in. |
| crash_dir = tempfile.mkdtemp() |
| + crash_service = None |
| + |
| try: |
| - print "# Generate symbols." |
| - breakpad_tools_dir = os.path.join( |
| - os.path.dirname(__file__), '..', '..', '..', |
| - 'components', 'crash', 'content', 'tools') |
| - generate_symbols = os.path.join( |
| - breakpad_tools_dir, 'generate_breakpad_symbols.py') |
| - symbols_dir = os.path.join(crash_dir, 'symbols') |
| - cmd = [generate_symbols, |
| - '--build-dir=%s' % options.build_dir, |
| - '--binary=%s' % options.binary, |
| - '--symbols-dir=%s' % symbols_dir, |
| - '--jobs=%d' % options.jobs] |
| - if options.verbose: |
| - cmd.append('--verbose') |
| - print ' '.join(cmd) |
| - failure = 'Failed to run generate_breakpad_symbols.py.' |
| - subprocess.check_call(cmd) |
| + if sys.platform == 'win32': |
| + print "# Starting crash service." |
| + crash_service_exe = os.path.join(options.build_dir, |
| + 'content_shell_crash_service.exe') |
| + cmd = [crash_service_exe, '--dumps-dir=%s' % crash_dir] |
| + if options.verbose: |
| + print ' '.join(cmd) |
| + failure = 'Failed to start crash service.' |
| + crash_service = subprocess.Popen(cmd) |
| + else: |
| + print "# Generate symbols." |
| + breakpad_tools_dir = os.path.join( |
| + os.path.dirname(__file__), '..', '..', '..', |
| + 'components', 'crash', 'content', 'tools') |
| + generate_symbols = os.path.join( |
| + breakpad_tools_dir, 'generate_breakpad_symbols.py') |
| + symbols_dir = os.path.join(crash_dir, 'symbols') |
| + cmd = [generate_symbols, |
| + '--build-dir=%s' % options.build_dir, |
| + '--binary=%s' % options.binary, |
| + '--symbols-dir=%s' % symbols_dir, |
| + '--jobs=%d' % options.jobs] |
| + if options.verbose: |
| + cmd.append('--verbose') |
| + print ' '.join(cmd) |
| + failure = 'Failed to run generate_breakpad_symbols.py.' |
| + subprocess.check_call(cmd) |
| print "# Run content_shell and make it crash." |
| cmd = [options.binary, |
| @@ -91,29 +103,48 @@ def main(): |
| with open(os.devnull, 'w') as devnull: |
| subprocess.check_call(cmd, stdout=devnull, stderr=devnull) |
| + if sys.platform == 'win32': |
| + print "# Stopping crash service" |
| + failure = 'Failed to stop crash service.' |
| + crash_service.terminate() |
| + crash_service = None |
| + |
| print "# Retrieve crash dump." |
| dmp_files = glob.glob(os.path.join(crash_dir, '*.dmp')) |
| failure = 'Expected 1 crash dump, found %d.' % len(dmp_files) |
| if len(dmp_files) != 1: |
| raise Exception(failure) |
| dmp_file = dmp_files[0] |
| - minidump = os.path.join(crash_dir, 'minidump') |
| - dmp_to_minidump = os.path.join(breakpad_tools_dir, 'dmp2minidump.py') |
| - cmd = [dmp_to_minidump, dmp_file, minidump] |
| - if options.verbose: |
| - print ' '.join(cmd) |
| - failure = 'Failed to run dmp_to_minidump.' |
| - subprocess.check_call(cmd) |
| + if sys.platform != 'win32': |
| + minidump = os.path.join(crash_dir, 'minidump') |
| + dmp_to_minidump = os.path.join(breakpad_tools_dir, 'dmp2minidump.py') |
| + cmd = [dmp_to_minidump, dmp_file, minidump] |
| + if options.verbose: |
| + print ' '.join(cmd) |
| + failure = 'Failed to run dmp_to_minidump.' |
| + subprocess.check_call(cmd) |
| print "# Symbolize crash dump." |
| - minidump_stackwalk = os.path.join(options.build_dir, 'minidump_stackwalk') |
| - cmd = [minidump_stackwalk, minidump, symbols_dir] |
| - if options.verbose: |
| - print ' '.join(cmd) |
| - failure = 'Failed to run minidump_stackwalk.' |
| - proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
| - stack = proc.communicate()[0] |
| + if sys.platform == 'win32': |
| + cdb_exe = os.path.join(options.build_dir, 'cdb', 'cdb.exe') |
|
scottmg
2017/03/29 23:17:39
you might also try chdiring to the $build_dir/cdb
|
| + cmd = [cdb_exe, '-y', options.build_dir, '-c', '.lines;.excr;k30;q', |
| + '-z', dmp_file] |
| + if options.verbose: |
| + print ' '.join(cmd) |
| + failure = 'Failed to run cdb.exe.' |
| + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
| + stderr=subprocess.PIPE) |
| + stack = proc.communicate()[0] |
| + else: |
| + minidump_stackwalk = os.path.join(options.build_dir, 'minidump_stackwalk') |
| + cmd = [minidump_stackwalk, minidump, symbols_dir] |
| + if options.verbose: |
| + print ' '.join(cmd) |
| + failure = 'Failed to run minidump_stackwalk.' |
| + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
| + stderr=subprocess.PIPE) |
| + stack = proc.communicate()[0] |
| # Check whether the stack contains a CrashIntentionally symbol. |
| found_symbol = 'CrashIntentionally' in stack |
| @@ -147,6 +178,8 @@ def main(): |
| return 0 |
| finally: |
| + if crash_service: |
| + crash_service.terminate() |
| try: |
| shutil.rmtree(crash_dir) |
| except: |