Index: testing/test_env.py |
diff --git a/testing/test_env.py b/testing/test_env.py |
index 5f94326a9d198edd2cadc49e74e996931732f201..0743f340038f4639884a0b131e46c088ce2dd9d6 100755 |
--- a/testing/test_env.py |
+++ b/testing/test_env.py |
@@ -105,6 +105,42 @@ def get_asan_env(cmd, lsan): |
return extra_env |
+def get_sanitizer_symbolize_command(json_path=None): |
+ """Construct the command to invoke offline symbolization script.""" |
+ script_path = '../tools/valgrind/asan/asan_symbolize.py' |
+ cmd = [sys.executable, script_path] |
+ if json_path is not None: |
+ cmd.append('--test-summary-json-file=%s' % json_path) |
+ return cmd |
+ |
+ |
+def get_json_path(cmd): |
+ """Extract the JSON test summary path from a command line.""" |
+ json_path_flag = '--test-launcher-summary-output=' |
+ for arg in cmd: |
+ if arg.startswith(json_path_flag): |
+ return arg.split(json_path_flag).pop() |
+ return None |
+ |
+ |
+def symbolize_snippets_in_json(cmd, env): |
+ """Symbolize output snippets inside the JSON test summary.""" |
+ json_path = get_json_path(cmd) |
+ if json_path is None: |
+ return |
+ |
+ try: |
+ symbolize_command = get_sanitizer_symbolize_command(json_path=json_path) |
+ p = subprocess.Popen(symbolize_command, stderr=subprocess.PIPE, env=env) |
+ (_, stderr) = p.communicate() |
+ except OSError as e: |
+ print 'Exception while symbolizing snippets: %s' % e |
+ |
+ if p.returncode != 0: |
+ print "Error: failed to symbolize snippets in JSON:\n" |
+ print stderr |
+ |
+ |
def run_executable(cmd, env): |
"""Runs an executable with: |
- environment variable CR_SOURCE_ROOT set to the root directory. |
@@ -123,6 +159,7 @@ def run_executable(cmd, env): |
# Copy logic from tools/build/scripts/slave/runtest.py. |
asan = '--asan=1' in cmd |
lsan = '--lsan=1' in cmd |
+ use_symbolization_script = asan and not lsan |
if asan: |
extra_env.update(get_asan_env(cmd, lsan)) |
@@ -146,16 +183,17 @@ def run_executable(cmd, env): |
env.update(extra_env or {}) |
try: |
# See above comment regarding offline symbolization. |
- if asan and not lsan: |
+ if use_symbolization_script: |
# Need to pipe to the symbolizer script. |
p1 = subprocess.Popen(cmd, env=env, stdout=subprocess.PIPE, |
stderr=sys.stdout) |
- p2 = subprocess.Popen([sys.executable, |
- "../tools/valgrind/asan/asan_symbolize.py"], |
+ p2 = subprocess.Popen(get_sanitizer_symbolize_command(), |
env=env, stdin=p1.stdout) |
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. |
p1.wait() |
p2.wait() |
+ # Also feed the out-of-band JSON output to the symbolizer script. |
+ symbolize_snippets_in_json(cmd, env) |
return p1.returncode |
else: |
return subprocess.call(cmd, env=env) |