diff options
author | Alexey Samsonov <samsonov@google.com> | 2014-03-05 15:00:36 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2014-03-05 15:00:36 +0000 |
commit | 225729bf74369449219467a95cfb5faf5e644fb7 (patch) | |
tree | 0964179735ea9c5df0cfc42c757975c6b4983594 /lib | |
parent | db0199550e4b72be1157d21bd6b1c67aa1bd880b (diff) |
Improve llvm-symbolizer discovery in asan_symbolize.py
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@202982 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rwxr-xr-x | lib/asan/scripts/asan_symbolize.py | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/lib/asan/scripts/asan_symbolize.py b/lib/asan/scripts/asan_symbolize.py index a398fcf10..49bc1c02c 100755 --- a/lib/asan/scripts/asan_symbolize.py +++ b/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). |