Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(388)

Unified Diff: tools/valgrind/asan/asan_symbolize.py

Issue 10987049: Move the symbolization code to tools/valgrind/asan/asan_symbolize_trunk.py (it's now a copy of the … (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/valgrind/asan/README.third_party ('k') | tools/valgrind/asan/asan_symbolize_trunk.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/valgrind/asan/asan_symbolize.py
===================================================================
--- tools/valgrind/asan/asan_symbolize.py (revision 158774)
+++ tools/valgrind/asan/asan_symbolize.py (working copy)
@@ -4,17 +4,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import os
+from asan_symbolize_trunk import SymbolizationLoop
+
import re
import sys
-import string
-import subprocess
-pipes = {}
-filetypes = {}
-vmaddrs = {}
-DEBUG=False
-
def fix_filename(file_name):
for path_to_cut in sys.argv[1:]:
file_name = re.sub(".*" + path_to_cut, "", file_name)
@@ -22,139 +16,6 @@
file_name = re.sub(".*crtstuff.c:0", "???:0", file_name)
return file_name
-# TODO(glider): need some refactoring here
-def symbolize_addr2line(line):
- #0 0x7f6e35cf2e45 (/blah/foo.so+0x11fe45)
- match = re.match('^( *#([0-9]+) *0x[0-9a-f]+) *\((.*)\+(0x[0-9a-f]+)\)', line)
- if match:
- frameno = match.group(2)
- binary = match.group(3)
- addr = match.group(4)
- if not pipes.has_key(binary):
- pipes[binary] = subprocess.Popen(["addr2line", "-f", "-e", binary],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- stderr=open(os.devnull, 'w'))
- p = pipes[binary]
- try:
- print >>p.stdin, addr
- function_name = p.stdout.readline().rstrip()
- file_name = p.stdout.readline().rstrip()
- except:
- function_name = ""
- file_name = ""
- file_name = fix_filename(file_name)
-
- print match.group(1), "in", function_name, file_name
- else:
- print line.rstrip()
-
-def fix_binary_for_chromium(binary):
- BUILDTYPE = 'Release'
- # Chromium Helper EH is the same binary as Chromium Helper, but there's no
- # .dSYM directory for it.
- binary = binary.replace('Chromium Helper EH', 'Chromium Helper')
- pieces = binary.split(BUILDTYPE)
- if len(pieces) != 2:
- return binary
- prefix, suffix = pieces
- to_fix = { 'Chromium Framework': 'framework',
- 'Chromium Helper': 'app' }
- for filename in to_fix:
- ext = to_fix[filename]
- if suffix.endswith(filename):
- binary = (prefix + BUILDTYPE + '/' + filename + '.' +
- ext + '.dSYM/Contents/Resources/DWARF/' + filename)
- return binary
- filename = suffix.split('/')[-1]
- binary = (prefix + BUILDTYPE + '/' + filename +
- '.dSYM/Contents/Resources/DWARF/' + filename)
- return binary
-
-
-# Get the skew value to be added to the address.
-# We're ooking for the following piece in otool -l output:
-# Load command 0
-# cmd LC_SEGMENT
-# cmdsize 736
-# segname __TEXT
-# vmaddr 0x00000000
-def get_binary_vmaddr(binary):
- if binary in vmaddrs:
- return vmaddrs[binary]
- cmdline = ["otool", "-l", binary]
- pipe = subprocess.Popen(cmdline,
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE)
- is_text = False
- vmaddr = 0
- for line in pipe.stdout.readlines():
- line = line.strip()
- if line.startswith('segname'):
- is_text = (line == 'segname __TEXT')
- continue
- if line.startswith('vmaddr') and is_text:
- sv = line.split(' ')
- vmaddr = int(sv[-1], 16)
- break
- vmaddrs[binary] = vmaddr
- return vmaddr
-
-
-def write_addr_to_pipe(pipe, addr, offset, binary):
- skew = get_binary_vmaddr(binary)
- print >>pipe, "0x%x" % (int(offset, 16) + skew)
-
-def open_atos(binary):
- #print "atos -o %s -l %s" % (binary, hex(load_addr))
- cmdline = ["atos", "-o", binary]
- return subprocess.Popen(cmdline,
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE)
-
-def symbolize_atos(line):
- #0 0x7f6e35cf2e45 (/blah/foo.so+0x11fe45)
- match = re.match('^( *#[0-9]+ *)(0x[0-9a-f]+) *\((.*)\+(0x[0-9a-f]+)\)', line)
- if match:
- #print line
- prefix = match.group(1)
- addr = match.group(2)
- binary = match.group(3)
- offset = match.group(4)
- load_addr = int(addr, 16) - int(offset, 16)
- original_binary = binary
- binary = fix_binary_for_chromium(binary)
- if not pipes.has_key(binary):
- pipes[binary] = open_atos(binary)
- p = pipes[binary]
- try:
- write_addr_to_pipe(p.stdin, addr, offset, binary)
- except:
- # Oops, atos failed. Trying to use the original binary.
- binary = original_binary
- pipes[binary] = open_atos(binary)
- p = pipes[binary]
- write_addr_to_pipe(p.stdin, addr, offset, binary)
-
- # TODO(glider): it's more efficient to make a batch atos run for each
- # binary.
- p.stdin.close()
- atos_line = p.stdout.readline().rstrip()
- del pipes[binary]
-
- print "%s%s in %s" % (prefix, addr, atos_line)
- else:
- print line.rstrip()
-
-def main():
- system = os.uname()[0]
- if system in ['Linux', 'Darwin']:
- for line in sys.stdin:
- if system == 'Linux':
- symbolize_addr2line(line)
- elif system == 'Darwin':
- symbolize_atos(line)
- else:
- print 'Unknown system: ', system
-
if __name__ == '__main__':
- main()
+ loop = SymbolizationLoop(binary_name_filter=fix_filename)
M-A Ruel 2012/09/26 16:58:30 still prefer a main() function.
+ loop.process_stdin()
« no previous file with comments | « tools/valgrind/asan/README.third_party ('k') | tools/valgrind/asan/asan_symbolize_trunk.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698