Commit 9bd5d58a authored by earthdok's avatar earthdok Committed by Commit bot

Symbolize JSON output snippets in swarming ASan runs.

This mirrors an earlier change to non-swarming runs:
https://codereview.chromium.org/810643006/

BUG=372458
R=vadimsh@chromium.org

Review URL: https://codereview.chromium.org/865853009

Cr-Commit-Position: refs/heads/master@{#313793}
parent 6b6714d2
...@@ -105,6 +105,42 @@ def get_asan_env(cmd, lsan): ...@@ -105,6 +105,42 @@ def get_asan_env(cmd, lsan):
return extra_env 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): def run_executable(cmd, env):
"""Runs an executable with: """Runs an executable with:
- environment variable CR_SOURCE_ROOT set to the root directory. - environment variable CR_SOURCE_ROOT set to the root directory.
...@@ -123,6 +159,7 @@ def run_executable(cmd, env): ...@@ -123,6 +159,7 @@ def run_executable(cmd, env):
# Copy logic from tools/build/scripts/slave/runtest.py. # Copy logic from tools/build/scripts/slave/runtest.py.
asan = '--asan=1' in cmd asan = '--asan=1' in cmd
lsan = '--lsan=1' in cmd lsan = '--lsan=1' in cmd
use_symbolization_script = asan and not lsan
if asan: if asan:
extra_env.update(get_asan_env(cmd, lsan)) extra_env.update(get_asan_env(cmd, lsan))
...@@ -146,16 +183,17 @@ def run_executable(cmd, env): ...@@ -146,16 +183,17 @@ def run_executable(cmd, env):
env.update(extra_env or {}) env.update(extra_env or {})
try: try:
# See above comment regarding offline symbolization. # See above comment regarding offline symbolization.
if asan and not lsan: if use_symbolization_script:
# Need to pipe to the symbolizer script. # Need to pipe to the symbolizer script.
p1 = subprocess.Popen(cmd, env=env, stdout=subprocess.PIPE, p1 = subprocess.Popen(cmd, env=env, stdout=subprocess.PIPE,
stderr=sys.stdout) stderr=sys.stdout)
p2 = subprocess.Popen([sys.executable, p2 = subprocess.Popen(get_sanitizer_symbolize_command(),
"../tools/valgrind/asan/asan_symbolize.py"],
env=env, stdin=p1.stdout) env=env, stdin=p1.stdout)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
p1.wait() p1.wait()
p2.wait() p2.wait()
# Also feed the out-of-band JSON output to the symbolizer script.
symbolize_snippets_in_json(cmd, env)
return p1.returncode return p1.returncode
else: else:
return subprocess.call(cmd, env=env) return subprocess.call(cmd, env=env)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment