| 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)
|
|
|