Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 # purify_test.py | 6 # purify_test.py |
| 7 | 7 |
| 8 '''Runs an exe through Valgrind and puts the intermediate files in a | 8 '''Runs an exe through Valgrind and puts the intermediate files in a |
| 9 directory. | 9 directory. |
| 10 ''' | 10 ''' |
| 11 | 11 |
| 12 import datetime | 12 import datetime |
| 13 import glob | 13 import glob |
| 14 import logging | 14 import logging |
| 15 import optparse | 15 import optparse |
| 16 import os | 16 import os |
| 17 import shutil | 17 import shutil |
| 18 import stat | |
| 18 import sys | 19 import sys |
| 20 import tempfile | |
| 19 | 21 |
| 20 import common | 22 import common |
| 21 | 23 |
| 22 import valgrind_analyze | 24 import valgrind_analyze |
| 23 | 25 |
| 24 import google.logging_utils | 26 import google.logging_utils |
| 25 | 27 |
| 26 rmtree = shutil.rmtree | 28 rmtree = shutil.rmtree |
| 27 | 29 |
| 28 class Valgrind(object): | 30 class Valgrind(object): |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 51 help="path to top of source tree for this build" | 53 help="path to top of source tree for this build" |
| 52 "(used to normalize source paths in baseline)") | 54 "(used to normalize source paths in baseline)") |
| 53 self._parser.add_option("", "--suppressions", default=["."], | 55 self._parser.add_option("", "--suppressions", default=["."], |
| 54 action="append", | 56 action="append", |
| 55 help="path to a valgrind suppression file") | 57 help="path to a valgrind suppression file") |
| 56 self._parser.add_option("", "--gtest_filter", default="", | 58 self._parser.add_option("", "--gtest_filter", default="", |
| 57 help="which test case to run") | 59 help="which test case to run") |
| 58 self._parser.add_option("", "--gtest_print_time", action="store_true", | 60 self._parser.add_option("", "--gtest_print_time", action="store_true", |
| 59 default=False, | 61 default=False, |
| 60 help="show how long each test takes") | 62 help="show how long each test takes") |
| 63 self._parser.add_option("", "--trace_children", action="store_true", | |
| 64 default=False, | |
| 65 help="also trace child processes") | |
| 66 self._parser.add_option("", "--indirect", action="store_true", | |
| 67 default=False, | |
| 68 help="set BROWSER_WRAPPER rather than running valgri nd directly") | |
|
Dean McNamee
2009/03/27 11:34:55
80 cols
| |
| 61 self._parser.add_option("", "--show_all_leaks", action="store_true", | 69 self._parser.add_option("", "--show_all_leaks", action="store_true", |
| 62 default=False, | 70 default=False, |
| 63 help="also show less blatant leaks") | 71 help="also show less blatant leaks") |
| 64 self._parser.add_option("", "--generate_suppressions", action="store_true", | 72 self._parser.add_option("", "--generate_suppressions", action="store_true", |
| 65 default=False, | 73 default=False, |
| 66 help="Skip analysis and generate suppressions") | 74 help="Skip analysis and generate suppressions") |
| 67 self._parser.add_option("-v", "--verbose", action="store_true", default=Fals e, | 75 self._parser.add_option("-v", "--verbose", action="store_true", default=Fals e, |
| 68 help="verbose output - enable debug log messages") | 76 help="verbose output - enable debug log messages") |
| 69 self._parser.description = __doc__ | 77 self._parser.description = __doc__ |
| 70 | 78 |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 170 """Get the valgrind command to run.""" | 178 """Get the valgrind command to run.""" |
| 171 # note that self._args begins with the exe to be run | 179 # note that self._args begins with the exe to be run |
| 172 # TODO(erg): We probably want to get a version of valgrind that supports | 180 # TODO(erg): We probably want to get a version of valgrind that supports |
| 173 # the "--track-origins" option... | 181 # the "--track-origins" option... |
| 174 proc = ["valgrind", "--smc-check=all", "--leak-check=full", | 182 proc = ["valgrind", "--smc-check=all", "--leak-check=full", |
| 175 "--num-callers=30"] | 183 "--num-callers=30"] |
| 176 | 184 |
| 177 if self._options.show_all_leaks: | 185 if self._options.show_all_leaks: |
| 178 proc += ["--show-reachable=yes"]; | 186 proc += ["--show-reachable=yes"]; |
| 179 | 187 |
| 188 if self._options.trace_children: | |
| 189 proc += ["--trace-children=yes"]; | |
| 190 | |
| 180 # Either generate suppressions or load them. | 191 # Either generate suppressions or load them. |
| 181 if self._generate_suppressions: | 192 if self._generate_suppressions: |
| 182 proc += ["--gen-suppressions=all"] | 193 proc += ["--gen-suppressions=all"] |
| 183 else: | 194 else: |
| 184 proc += ["--xml=yes"] | 195 proc += ["--xml=yes"] |
| 185 | 196 |
| 186 suppression_count = 0 | 197 suppression_count = 0 |
| 187 for suppression_file in self._suppressions: | 198 for suppression_file in self._suppressions: |
| 188 if os.path.exists(suppression_file): | 199 if os.path.exists(suppression_file): |
| 189 suppression_count += 1 | 200 suppression_count += 1 |
| 190 proc += ["--suppressions=%s" % suppression_file] | 201 proc += ["--suppressions=%s" % suppression_file] |
| 191 | 202 |
| 192 if not suppression_count: | 203 if not suppression_count: |
| 193 logging.warning("WARNING: NOT USING SUPPRESSIONS!") | 204 logging.warning("WARNING: NOT USING SUPPRESSIONS!") |
| 194 | 205 |
| 195 proc += ["--log-file=" + self.TMP_DIR + "/valgrind.%p"] + self._args | 206 proc += ["--log-file=" + self.TMP_DIR + "/valgrind.%p"] |
| 207 | |
| 208 if self._options.indirect: | |
| 209 # The program being run invokes Python or something else | |
| 210 # that can't stand to be valgrinded, and also invokes | |
| 211 # the Chrome browser. Set an environment variable to | |
| 212 # tell the program to prefix the Chrome commandline | |
| 213 # with a magic wrapper. Build the magic wrapper here. | |
| 214 (fd, indirect_fname) = tempfile.mkstemp(dir=self.TMP_DIR, prefix="browser_ wrapper.", text=True) | |
| 215 f = os.fdopen(fd, "w"); | |
| 216 f.write("#!/bin/sh\n") | |
| 217 f.write(" ".join(proc)) | |
| 218 f.write(' "$@"\n') | |
| 219 f.close() | |
| 220 os.chmod(indirect_fname, stat.S_IRUSR|stat.S_IXUSR) | |
| 221 os.putenv("BROWSER_WRAPPER", indirect_fname) | |
| 222 logging.info('export BROWSER_WRAPPER=' + indirect_fname); | |
| 223 proc = [] | |
| 224 | |
| 225 proc += self._args | |
| 196 return proc | 226 return proc |
| 197 | 227 |
| 198 | 228 |
| 199 class ValgrindMac(Valgrind): | 229 class ValgrindMac(Valgrind): |
| 200 | 230 |
| 201 """Valgrind on Mac OS X. | 231 """Valgrind on Mac OS X. |
| 202 | 232 |
| 203 Valgrind on OS X does not support suppressions (yet). | 233 Valgrind on OS X does not support suppressions (yet). |
| 204 """ | 234 """ |
| 205 | 235 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 247 valgrind = ValgrindMac() | 277 valgrind = ValgrindMac() |
| 248 retcode = valgrind.Main() | 278 retcode = valgrind.Main() |
| 249 sys.exit(retcode) | 279 sys.exit(retcode) |
| 250 elif sys.platform == 'linux2': # Linux | 280 elif sys.platform == 'linux2': # Linux |
| 251 valgrind = ValgrindLinux() | 281 valgrind = ValgrindLinux() |
| 252 retcode = valgrind.Main() | 282 retcode = valgrind.Main() |
| 253 sys.exit(retcode) | 283 sys.exit(retcode) |
| 254 else: | 284 else: |
| 255 logging.error("Unknown platform: %s" % sys.platform) | 285 logging.error("Unknown platform: %s" % sys.platform) |
| 256 sys.exit(1) | 286 sys.exit(1) |
| OLD | NEW |