Home | History | Annotate | Download | only in asan
      1 #!/usr/bin/env python
      2 
      3 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      4 # Use of this source code is governed by a BSD-style license that can be
      5 # found in the LICENSE file.
      6 
      7 from third_party import asan_symbolize
      8 
      9 import os
     10 import sys
     11 
     12 class LineBuffered(object):
     13   """Disable buffering on a file object."""
     14   def __init__(self, stream):
     15     self.stream = stream
     16 
     17   def write(self, data):
     18     self.stream.write(data)
     19     if '\n' in data:
     20       self.stream.flush()
     21 
     22   def __getattr__(self, attr):
     23     return getattr(self.stream, attr)
     24 
     25 
     26 def disable_buffering():
     27   """Makes this process and child processes stdout unbuffered."""
     28   if not os.environ.get('PYTHONUNBUFFERED'):
     29     # Since sys.stdout is a C++ object, it's impossible to do
     30     # sys.stdout.write = lambda...
     31     sys.stdout = LineBuffered(sys.stdout)
     32     os.environ['PYTHONUNBUFFERED'] = 'x'
     33 
     34 
     35 def set_symbolizer_path():
     36   """Set the path to the llvm-symbolize binary in the Chromium source tree."""
     37   if not os.environ.get('LLVM_SYMBOLIZER_PATH'):
     38     script_dir = os.path.dirname(os.path.abspath(__file__))
     39     # Assume this script resides three levels below src/ (i.e.
     40     # src/tools/valgrind/asan/).
     41     src_root = os.path.join(script_dir, "..", "..", "..")
     42     symbolizer_path = os.path.join(src_root, 'third_party',
     43         'llvm-build', 'Release+Asserts', 'bin', 'llvm-symbolizer')
     44     assert(os.path.isfile(symbolizer_path))
     45     os.environ['LLVM_SYMBOLIZER_PATH'] = os.path.abspath(symbolizer_path)
     46 
     47 
     48 def main():
     49   disable_buffering()
     50   set_symbolizer_path()
     51   asan_symbolize.demangle = True
     52   asan_symbolize.fix_filename_patterns = sys.argv[1:]
     53   asan_symbolize.logfile = sys.stdin
     54   loop = asan_symbolize.SymbolizationLoop()
     55   loop.process_logfile()
     56 
     57 if __name__ == '__main__':
     58   main()
     59