OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 | 2 |
3 # Copyright 2015 The Crashpad Authors. All rights reserved. | 3 # Copyright 2015 The Crashpad Authors. All rights reserved. |
4 # | 4 # |
5 # Licensed under the Apache License, Version 2.0 (the "License"); | 5 # Licensed under the Apache License, Version 2.0 (the "License"); |
6 # you may not use this file except in compliance with the License. | 6 # you may not use this file except in compliance with the License. |
7 # You may obtain a copy of the License at | 7 # You may obtain a copy of the License at |
8 # | 8 # |
9 # http://www.apache.org/licenses/LICENSE-2.0 | 9 # http://www.apache.org/licenses/LICENSE-2.0 |
10 # | 10 # |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 return app_path | 74 return app_path |
75 return None | 75 return None |
76 | 76 |
77 | 77 |
78 def GetDumpFromCrashyProgram(out_dir, pipe_name): | 78 def GetDumpFromCrashyProgram(out_dir, pipe_name): |
79 """Initialize a crash database, run crashpad_handler, run crashy_program | 79 """Initialize a crash database, run crashpad_handler, run crashy_program |
80 connecting to the crash_handler. Returns the minidump generated by | 80 connecting to the crash_handler. Returns the minidump generated by |
81 crash_handler for further testing. | 81 crash_handler for further testing. |
82 """ | 82 """ |
83 test_database = MakeTempDir() | 83 test_database = MakeTempDir() |
| 84 handler = None |
84 | 85 |
85 try: | 86 try: |
86 if subprocess.call( | 87 if subprocess.call( |
87 [os.path.join(out_dir, 'crashpad_database_util.exe'), '--create', | 88 [os.path.join(out_dir, 'crashpad_database_util.exe'), '--create', |
88 '--database=' + test_database]) != 0: | 89 '--database=' + test_database]) != 0: |
89 print 'could not initialize report database' | 90 print 'could not initialize report database' |
90 return None | 91 return None |
91 | 92 |
92 handler = subprocess.Popen([ | 93 handler = subprocess.Popen([ |
93 os.path.join(out_dir, 'crashpad_handler.exe'), | 94 os.path.join(out_dir, 'crashpad_handler.exe'), |
94 '--pipe-name=' + pipe_name, | 95 '--pipe-name=' + pipe_name, |
95 '--database=' + test_database | 96 '--database=' + test_database |
96 ]) | 97 ]) |
97 | 98 |
98 subprocess.call([os.path.join(out_dir, 'crashy_program.exe'), pipe_name]) | 99 subprocess.call([os.path.join(out_dir, 'crashy_program.exe'), pipe_name]) |
99 | 100 |
100 out = subprocess.check_output([ | 101 out = subprocess.check_output([ |
101 os.path.join(out_dir, 'crashpad_database_util.exe'), | 102 os.path.join(out_dir, 'crashpad_database_util.exe'), |
102 '--database=' + test_database, | 103 '--database=' + test_database, |
103 '--show-completed-reports', | 104 '--show-completed-reports', |
104 '--show-all-report-info', | 105 '--show-all-report-info', |
105 ]) | 106 ]) |
106 for line in out.splitlines(): | 107 for line in out.splitlines(): |
107 if line.strip().startswith('Path:'): | 108 if line.strip().startswith('Path:'): |
108 return line.partition(':')[2].strip() | 109 return line.partition(':')[2].strip() |
109 | |
110 finally: | 110 finally: |
111 if handler: | 111 if handler: |
112 handler.kill() | 112 handler.kill() |
113 | 113 |
114 | 114 |
115 class CdbRun(object): | 115 class CdbRun(object): |
116 """Run cdb.exe passing it a cdb command and capturing the output. | 116 """Run cdb.exe passing it a cdb command and capturing the output. |
117 `Check()` searches for regex patterns in sequence allowing verification of | 117 `Check()` searches for regex patterns in sequence allowing verification of |
118 expected output. | 118 expected output. |
119 """ | 119 """ |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 out.Check(r'ExceptionList:\s+[0-9a-fA-F]+', 'some valid teb data') | 170 out.Check(r'ExceptionList:\s+[0-9a-fA-F]+', 'some valid teb data') |
171 out.Check(r'LastErrorValue:\s+2', 'correct LastErrorValue') | 171 out.Check(r'LastErrorValue:\s+2', 'correct LastErrorValue') |
172 | 172 |
173 out = CdbRun(cdb_path, dump_path, '!gle') | 173 out = CdbRun(cdb_path, dump_path, '!gle') |
174 out.Check('LastErrorValue: \(Win32\) 0x2 \(2\) - The system cannot find the ' | 174 out.Check('LastErrorValue: \(Win32\) 0x2 \(2\) - The system cannot find the ' |
175 'file specified.', '!gle gets last error') | 175 'file specified.', '!gle gets last error') |
176 out.Check('LastStatusValue: \(NTSTATUS\) 0xc000000f - {File Not Found} The ' | 176 out.Check('LastStatusValue: \(NTSTATUS\) 0xc000000f - {File Not Found} The ' |
177 'file %hs does not exist.', '!gle gets last ntstatus') | 177 'file %hs does not exist.', '!gle gets last ntstatus') |
178 | 178 |
179 # Locks. | 179 # Locks. |
180 out = CdbRun(cdb_path, dump_path, '!locks') | 180 if False: # The code for these isn't landed yet. |
181 out.Check(r'CritSec crashy_program!crashpad::`anonymous namespace\'::' | 181 out = CdbRun(cdb_path, dump_path, '!locks') |
182 r'g_test_critical_section', 'lock was captured') | 182 out.Check(r'CritSec crashy_program!crashpad::`anonymous namespace\'::' |
183 out.Check(r'\*\*\* Locked', 'lock debug info was captured, and is locked') | 183 r'g_test_critical_section', 'lock was captured') |
| 184 out.Check(r'\*\*\* Locked', 'lock debug info was captured, and is locked') |
184 | 185 |
185 | 186 |
186 def main(args): | 187 def main(args): |
187 try: | 188 try: |
188 if len(args) != 1: | 189 if len(args) != 1: |
189 print >>sys.stderr, 'must supply out dir' | 190 print >>sys.stderr, 'must supply out dir' |
190 return 1 | 191 return 1 |
191 | 192 |
192 cdb_path = GetCdbPath() | 193 cdb_path = GetCdbPath() |
193 if not cdb_path: | 194 if not cdb_path: |
194 print >>sys.stderr, 'could not find cdb' | 195 print >>sys.stderr, 'could not find cdb' |
195 return 1 | 196 return 1 |
196 | 197 |
197 pipe_name = r'\\.\pipe\end-to-end_%s_%s' % ( | 198 pipe_name = r'\\.\pipe\end-to-end_%s_%s' % ( |
198 os.getpid(), str(random.getrandbits(64))) | 199 os.getpid(), str(random.getrandbits(64))) |
199 | 200 |
200 dump_path = GetDumpFromCrashyProgram(args[0], pipe_name) | 201 dump_path = GetDumpFromCrashyProgram(args[0], pipe_name) |
201 if not dump_path: | 202 if not dump_path: |
202 return 1 | 203 return 1 |
203 | 204 |
204 RunTests(cdb_path, dump_path, pipe_name) | 205 RunTests(cdb_path, dump_path, pipe_name) |
205 | 206 |
206 return 0 | 207 return 0 |
207 finally: | 208 finally: |
208 CleanUpTempDirs() | 209 CleanUpTempDirs() |
209 | 210 |
210 | 211 |
211 if __name__ == '__main__': | 212 if __name__ == '__main__': |
212 sys.exit(main(sys.argv[1:])) | 213 sys.exit(main(sys.argv[1:])) |
OLD | NEW |