Index: tools/valgrind/asan/third_party/asan_symbolize.py |
diff --git a/tools/valgrind/asan/third_party/asan_symbolize.py b/tools/valgrind/asan/third_party/asan_symbolize.py |
index ffa57ee624e59333271e229efb0b905e496e11fb..59fceaaed814c031fc08ea301f146cfe862a3e8a 100755 |
--- a/tools/valgrind/asan/third_party/asan_symbolize.py |
+++ b/tools/valgrind/asan/third_party/asan_symbolize.py |
@@ -11,11 +11,9 @@ import argparse |
import bisect |
import getopt |
import os |
-import pty |
import re |
import subprocess |
import sys |
-import termios |
symbolizers = {} |
DEBUG = False |
@@ -171,6 +169,9 @@ class UnbufferedLineConverter(object): |
output. Uses pty to trick the child into providing unbuffered output. |
""" |
def __init__(self, args, close_stderr=False): |
+ # Local imports so that the script can start on Windows. |
+ import pty |
+ import termios |
pid, fd = pty.fork() |
if pid == 0: |
# We're the child. Transfer control to command. |
@@ -341,17 +342,23 @@ class BreakpadSymbolizer(Symbolizer): |
class SymbolizationLoop(object): |
def __init__(self, binary_name_filter=None, dsym_hint_producer=None): |
- # Used by clients who may want to supply a different binary name. |
- # E.g. in Chrome several binaries may share a single .dSYM. |
- self.binary_name_filter = binary_name_filter |
- self.dsym_hint_producer = dsym_hint_producer |
- self.system = os.uname()[0] |
- if self.system not in ['Linux', 'Darwin', 'FreeBSD']: |
- raise Exception('Unknown system') |
- self.llvm_symbolizers = {} |
- self.last_llvm_symbolizer = None |
- self.dsym_hints = set([]) |
- self.frame_no = 0 |
+ if sys.platform == 'win32': |
+ # ASan on Windows uses dbghelp.dll to symbolize in-process, which works |
+ # even in sandboxed processes. Nothing needs to be done here. |
+ self.process_line = self.process_line_echo |
+ else: |
+ # Used by clients who may want to supply a different binary name. |
+ # E.g. in Chrome several binaries may share a single .dSYM. |
+ self.binary_name_filter = binary_name_filter |
+ self.dsym_hint_producer = dsym_hint_producer |
+ self.system = os.uname()[0] |
+ if self.system not in ['Linux', 'Darwin', 'FreeBSD']: |
+ raise Exception('Unknown system') |
+ self.llvm_symbolizers = {} |
+ self.last_llvm_symbolizer = None |
+ self.dsym_hints = set([]) |
+ self.frame_no = 0 |
+ self.process_line = self.process_line_posix |
def symbolize_address(self, addr, binary, offset): |
# On non-Darwin (i.e. on platforms without .dSYM debug info) always use |
@@ -405,14 +412,14 @@ class SymbolizationLoop(object): |
def process_logfile(self): |
self.frame_no = 0 |
- while True: |
- line = logfile.readline() |
- if not line: |
- break |
+ for line in logfile: |
processed = self.process_line(line) |
print '\n'.join(processed) |
- def process_line(self, line): |
+ def process_line_echo(self, line): |
+ return [line.rstrip()] |
+ |
+ def process_line_posix(self, line): |
self.current_line = line.rstrip() |
#0 0x7f6e35cf2e45 (/blah/foo.so+0x11fe45) |
stack_trace_line_format = ( |
@@ -437,20 +444,23 @@ class SymbolizationLoop(object): |
if __name__ == '__main__': |
- parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, |
- description='ASan symbolization script', |
- epilog='''Example of use: |
- asan_symbolize.py -c "$HOME/opt/cross/bin/arm-linux-gnueabi-" -s "$HOME/SymbolFiles" < asan.log''') |
+ parser = argparse.ArgumentParser( |
+ formatter_class=argparse.RawDescriptionHelpFormatter, |
+ description='ASan symbolization script', |
+ epilog='Example of use:\n' |
+ 'asan_symbolize.py -c "$HOME/opt/cross/bin/arm-linux-gnueabi-" ' |
+ '-s "$HOME/SymbolFiles" < asan.log') |
parser.add_argument('path_to_cut', nargs='*', |
- help='pattern to be cut from the result file path ') |
+ help='pattern to be cut from the result file path ') |
parser.add_argument('-d','--demangle', action='store_true', |
- help='demangle function names') |
+ help='demangle function names') |
parser.add_argument('-s', metavar='SYSROOT', |
- help='set path to sysroot for sanitized binaries') |
+ 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') |
+ 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 |