Commit f7aef702 authored by earthdok's avatar earthdok Committed by Commit bot

Roll asan_symbolize.py to llvm r218071.

This fixes an issue with missing newlines in stacktraces.

BUG=https://code.google.com/p/address-sanitizer/issues/detail?id=343
TBR=glider@chromium.org
NOTRY=true

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

Cr-Commit-Position: refs/heads/master@{#295531}
parent 7975dd82
Name: asan_symbolize.py Name: asan_symbolize.py
License: University of Illinois Open Source License. License: University of Illinois Open Source License.
Version: 213136 Version: 218071
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/scripts/asan_symbolize.py?view=co&content-type=text%2Fplain URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/scripts/asan_symbolize.py?view=co&content-type=text%2Fplain
asan_symbolize.py is a verbatim copy of asan_symbolize.py in the LLVM trunk. asan_symbolize.py is a verbatim copy of asan_symbolize.py in the LLVM trunk.
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
# License. See LICENSE.TXT for details. # License. See LICENSE.TXT for details.
# #
#===------------------------------------------------------------------------===# #===------------------------------------------------------------------------===#
import argparse
import bisect import bisect
import getopt import getopt
import os import os
...@@ -18,18 +19,26 @@ import termios ...@@ -18,18 +19,26 @@ import termios
symbolizers = {} symbolizers = {}
DEBUG = False DEBUG = False
demangle = False; demangle = False
binutils_prefix = None
sysroot_path = None
binary_name_filter = None
fix_filename_patterns = None
logfile = None
# FIXME: merge the code that calls fix_filename(). # FIXME: merge the code that calls fix_filename().
def fix_filename(file_name): def fix_filename(file_name):
for path_to_cut in sys.argv[1:]: if fix_filename_patterns:
file_name = re.sub('.*' + path_to_cut, '', file_name) for path_to_cut in fix_filename_patterns:
file_name = re.sub('.*' + path_to_cut, '', file_name)
file_name = re.sub('.*asan_[a-z_]*.cc:[0-9]*', '_asan_rtl_', file_name) file_name = re.sub('.*asan_[a-z_]*.cc:[0-9]*', '_asan_rtl_', file_name)
file_name = re.sub('.*crtstuff.c:0', '???:0', file_name) file_name = re.sub('.*crtstuff.c:0', '???:0', file_name)
return file_name return file_name
def GuessArch(addr): def sysroot_path_filter(binary_name):
return sysroot_path + binary_name
def guess_arch(addr):
# Guess which arch we're running. 10 = len('0x') + 8 hex digits. # Guess which arch we're running. 10 = len('0x') + 8 hex digits.
if len(addr) > 10: if len(addr) > 10:
return 'x86_64' return 'x86_64'
...@@ -60,7 +69,7 @@ class LLVMSymbolizer(Symbolizer): ...@@ -60,7 +69,7 @@ class LLVMSymbolizer(Symbolizer):
def __init__(self, symbolizer_path, addr): def __init__(self, symbolizer_path, addr):
super(LLVMSymbolizer, self).__init__() super(LLVMSymbolizer, self).__init__()
self.symbolizer_path = symbolizer_path self.symbolizer_path = symbolizer_path
self.default_arch = GuessArch(addr) self.default_arch = guess_arch(addr)
self.pipe = self.open_llvm_symbolizer() self.pipe = self.open_llvm_symbolizer()
def open_llvm_symbolizer(self): def open_llvm_symbolizer(self):
...@@ -124,7 +133,10 @@ class Addr2LineSymbolizer(Symbolizer): ...@@ -124,7 +133,10 @@ class Addr2LineSymbolizer(Symbolizer):
self.pipe = self.open_addr2line() self.pipe = self.open_addr2line()
def open_addr2line(self): def open_addr2line(self):
cmd = ['addr2line', '-f'] addr2line_tool = 'addr2line'
if binutils_prefix:
addr2line_tool = binutils_prefix + addr2line_tool
cmd = [addr2line_tool, '-f']
if demangle: if demangle:
cmd += ['--demangle'] cmd += ['--demangle']
cmd += ['-e', self.binary] cmd += ['-e', self.binary]
...@@ -182,7 +194,7 @@ class DarwinSymbolizer(Symbolizer): ...@@ -182,7 +194,7 @@ class DarwinSymbolizer(Symbolizer):
def __init__(self, addr, binary): def __init__(self, addr, binary):
super(DarwinSymbolizer, self).__init__() super(DarwinSymbolizer, self).__init__()
self.binary = binary self.binary = binary
self.arch = GuessArch(addr) self.arch = guess_arch(addr)
self.open_atos() self.open_atos()
def open_atos(self): def open_atos(self):
...@@ -328,7 +340,7 @@ class SymbolizationLoop(object): ...@@ -328,7 +340,7 @@ class SymbolizationLoop(object):
# E.g. in Chrome several binaries may share a single .dSYM. # E.g. in Chrome several binaries may share a single .dSYM.
self.binary_name_filter = binary_name_filter self.binary_name_filter = binary_name_filter
self.system = os.uname()[0] self.system = os.uname()[0]
if self.system not in ['Linux', 'Darwin']: if self.system not in ['Linux', 'Darwin', 'FreeBSD']:
raise Exception('Unknown system') raise Exception('Unknown system')
self.llvm_symbolizer = None self.llvm_symbolizer = None
self.frame_no = 0 self.frame_no = 0
...@@ -363,14 +375,14 @@ class SymbolizationLoop(object): ...@@ -363,14 +375,14 @@ class SymbolizationLoop(object):
self.frame_no += 1 self.frame_no += 1
return result return result
def process_stdin(self): def process_logfile(self):
self.frame_no = 0 self.frame_no = 0
while True: while True:
line = sys.stdin.readline() line = logfile.readline()
if not line: if not line:
break break
processed = self.process_line(line) processed = self.process_line(line)
print ''.join(processed) print '\n'.join(processed)
def process_line(self, line): def process_line(self, line):
self.current_line = line.rstrip() self.current_line = line.rstrip()
...@@ -397,9 +409,33 @@ class SymbolizationLoop(object): ...@@ -397,9 +409,33 @@ class SymbolizationLoop(object):
if __name__ == '__main__': if __name__ == '__main__':
opts, args = getopt.getopt(sys.argv[1:], "d", ["demangle"]) parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
for o, a in opts: description='ASan symbolization script',
if o in ("-d", "--demangle"): epilog='''Example of use:
demangle = True; asan_symbolize.py -c "$HOME/opt/cross/bin/arm-linux-gnueabi-" -s "$HOME/SymbolFiles" < asan.log''')
loop = SymbolizationLoop() parser.add_argument('path_to_cut', nargs='*',
loop.process_stdin() help='pattern to be cut from the result file path ')
parser.add_argument('-d','--demangle', action='store_true',
help='demangle function names')
parser.add_argument('-s', metavar='SYSROOT',
help='set path to sysroot for sanitized binaries')
parser.add_argument('-c', metavar='CROSS_COMPILE',
help='set prefix for binutils')
parser.add_argument('-l','--logfile', default=sys.stdin, type=argparse.FileType('r'),
help='set log file name to parse, default is stdin')
args = parser.parse_args()
if args.path_to_cut:
fix_filename_patterns = args.path_to_cut
if args.demangle:
demangle = True
if args.s:
binary_name_filter = sysroot_path_filter
sysroot_path = args.s
if args.c:
binutils_prefix = args.c
if args.logfile:
logfile = args.logfile
else:
logfile = sys.stdin
loop = SymbolizationLoop(binary_name_filter)
loop.process_logfile()
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