From 8ad7a05bb43c45845107e1c1ba2ebf08848dbe05 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Wed, 5 Mar 2014 15:00:36 +0000 Subject: [PATCH] Improve llvm-symbolizer discovery in asan_symbolize.py llvm-svn: 202982 --- .../lib/asan/scripts/asan_symbolize.py | 41 +++++++++++-------- .../TestCases/asan-symbolize-sanity-test.cc | 2 +- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/compiler-rt/lib/asan/scripts/asan_symbolize.py b/compiler-rt/lib/asan/scripts/asan_symbolize.py index a398fcf10361..49bc1c02cb8a 100755 --- a/compiler-rt/lib/asan/scripts/asan_symbolize.py +++ b/compiler-rt/lib/asan/scripts/asan_symbolize.py @@ -16,7 +16,6 @@ import subprocess import sys import termios -llvm_symbolizer = None symbolizers = {} DEBUG = False demangle = False; @@ -30,6 +29,12 @@ def fix_filename(file_name): file_name = re.sub('.*crtstuff.c:0', '???:0', file_name) return file_name +def GuessArch(addr): + # Guess which arch we're running. 10 = len('0x') + 8 hex digits. + if len(addr) > 10: + return 'x86_64' + else: + return 'i386' class Symbolizer(object): def __init__(self): @@ -52,23 +57,27 @@ class Symbolizer(object): class LLVMSymbolizer(Symbolizer): - def __init__(self, symbolizer_path): + def __init__(self, symbolizer_path, addr): super(LLVMSymbolizer, self).__init__() self.symbolizer_path = symbolizer_path + self.default_arch = GuessArch(addr) self.pipe = self.open_llvm_symbolizer() def open_llvm_symbolizer(self): - if not os.path.exists(self.symbolizer_path): - return None cmd = [self.symbolizer_path, '--use-symbol-table=true', '--demangle=%s' % demangle, '--functions=true', - '--inlining=true'] + '--inlining=true', + '--default-arch=%s' % self.default_arch] if DEBUG: print ' '.join(cmd) - return subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) + try: + result = subprocess.Popen(cmd, stdin=subprocess.PIPE, + stdout=subprocess.PIPE) + except OSError: + result = None + return result def symbolize(self, addr, binary, offset): """Overrides Symbolizer.symbolize.""" @@ -98,14 +107,14 @@ class LLVMSymbolizer(Symbolizer): return result -def LLVMSymbolizerFactory(system): +def LLVMSymbolizerFactory(system, addr): symbolizer_path = os.getenv('LLVM_SYMBOLIZER_PATH') if not symbolizer_path: symbolizer_path = os.getenv('ASAN_SYMBOLIZER_PATH') if not symbolizer_path: # Assume llvm-symbolizer is in PATH. symbolizer_path = 'llvm-symbolizer' - return LLVMSymbolizer(symbolizer_path) + return LLVMSymbolizer(symbolizer_path, addr) class Addr2LineSymbolizer(Symbolizer): @@ -173,11 +182,7 @@ class DarwinSymbolizer(Symbolizer): def __init__(self, addr, binary): super(DarwinSymbolizer, self).__init__() self.binary = binary - # Guess which arch we're running. 10 = len('0x') + 8 hex digits. - if len(addr) > 10: - self.arch = 'x86_64' - else: - self.arch = 'i386' + self.arch = GuessArch(addr) self.open_atos() def open_atos(self): @@ -323,12 +328,14 @@ class SymbolizationLoop(object): # E.g. in Chrome several binaries may share a single .dSYM. self.binary_name_filter = binary_name_filter self.system = os.uname()[0] - if self.system in ['Linux', 'Darwin']: - self.llvm_symbolizer = LLVMSymbolizerFactory(self.system) - else: + if self.system not in ['Linux', 'Darwin']: raise Exception('Unknown system') + self.llvm_symbolizer = None def symbolize_address(self, addr, binary, offset): + # Initialize llvm-symbolizer lazily. + if not self.llvm_symbolizer: + self.llvm_symbolizer = LLVMSymbolizerFactory(self.system, addr) # Use the chain of symbolizers: # Breakpad symbolizer -> LLVM symbolizer -> addr2line/atos # (fall back to next symbolizer if the previous one fails). diff --git a/compiler-rt/test/asan/TestCases/asan-symbolize-sanity-test.cc b/compiler-rt/test/asan/TestCases/asan-symbolize-sanity-test.cc index 991dcec97a10..c61850f5d707 100644 --- a/compiler-rt/test/asan/TestCases/asan-symbolize-sanity-test.cc +++ b/compiler-rt/test/asan/TestCases/asan-symbolize-sanity-test.cc @@ -3,7 +3,7 @@ // RUN: %clangxx_asan -O0 %p/SharedLibs/shared-lib-test-so.cc -fPIC -shared -o %t-so.so // RUN: %clangxx_asan -O0 %s -o %t -// RUN: ASAN_SYMBOLIZER_PATH= not %t 2>&1 | %asan_symbolize | FileCheck %s +// RUN: ASAN_OPTIONS=symbolize=0 not %t 2>&1 | %asan_symbolize | FileCheck %s #include #include #include