| #!/usr/bin/env python |
| |
| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from third_party import asan_symbolize |
| |
| import os |
| import sys |
| |
| class LineBuffered(object): |
| """Disable buffering on a file object.""" |
| def __init__(self, stream): |
| self.stream = stream |
| |
| def write(self, data): |
| self.stream.write(data) |
| if '\n' in data: |
| self.stream.flush() |
| |
| def __getattr__(self, attr): |
| return getattr(self.stream, attr) |
| |
| |
| def disable_buffering(): |
| """Makes this process and child processes stdout unbuffered.""" |
| if not os.environ.get('PYTHONUNBUFFERED'): |
| # Since sys.stdout is a C++ object, it's impossible to do |
| # sys.stdout.write = lambda... |
| sys.stdout = LineBuffered(sys.stdout) |
| os.environ['PYTHONUNBUFFERED'] = 'x' |
| |
| |
| def set_symbolizer_path(): |
| """Set the path to the llvm-symbolize binary in the Chromium source tree.""" |
| if not os.environ.get('LLVM_SYMBOLIZER_PATH'): |
| script_dir = os.path.dirname(os.path.abspath(__file__)) |
| # Assume this script resides three levels below src/ (i.e. |
| # src/tools/valgrind/asan/). |
| src_root = os.path.join(script_dir, "..", "..", "..") |
| symbolizer_path = os.path.join(src_root, 'third_party', |
| 'llvm-build', 'Release+Asserts', 'bin', 'llvm-symbolizer') |
| assert(os.path.isfile(symbolizer_path)) |
| os.environ['LLVM_SYMBOLIZER_PATH'] = os.path.abspath(symbolizer_path) |
| |
| |
| def main(): |
| disable_buffering() |
| set_symbolizer_path() |
| asan_symbolize.demangle = True |
| asan_symbolize.fix_filename_patterns = sys.argv[1:] |
| asan_symbolize.logfile = sys.stdin |
| loop = asan_symbolize.SymbolizationLoop() |
| loop.process_logfile() |
| |
| if __name__ == '__main__': |
| main() |