| Index: tracing/tracing/extras/symbolizer/symbolize_trace.py
|
| diff --git a/tracing/tracing/extras/symbolizer/symbolize_trace.py b/tracing/tracing/extras/symbolizer/symbolize_trace.py
|
| index 7a5d6f2daed0fc52ea3fad0d616c491383dc0224..d8743e98f0de1b116d42095fdb6cf068cdfd8d35 100755
|
| --- a/tracing/tracing/extras/symbolizer/symbolize_trace.py
|
| +++ b/tracing/tracing/extras/symbolizer/symbolize_trace.py
|
| @@ -237,8 +237,8 @@ sys.path.append(_SYMBOLS_PATH)
|
| # pylint: disable=import-error
|
| import symbols.elf_symbolizer as elf_symbolizer
|
|
|
| -from . import symbolize_trace_atos_regex
|
| -from . import symbolize_trace_macho_reader
|
| +from tracing.extras.symbolizer import symbolize_trace_atos_regex
|
| +from tracing.extras.symbolizer import symbolize_trace_macho_reader
|
|
|
| _PY_UTILS_PATH = os.path.abspath(os.path.join(
|
| _TRACING_DIR,
|
| @@ -249,6 +249,9 @@ sys.path.append(_PY_UTILS_PATH)
|
| # pylint: disable=import-error
|
| import py_utils.cloud_storage as cloud_storage
|
|
|
| +_UNNAMED_FILE = 'unnamed'
|
| +
|
| +
|
| class NodeWrapper(object):
|
| """Wraps an event data node(s).
|
|
|
| @@ -317,7 +320,7 @@ class MemoryMap(NodeWrapper):
|
| def __init__(self, start_address, size, file_path):
|
| self._start_address = start_address
|
| self._size = size
|
| - self._file_path = file_path
|
| + self._file_path = file_path if file_path else _UNNAMED_FILE
|
|
|
| @property
|
| def start_address(self):
|
| @@ -986,6 +989,7 @@ class SymbolizableFile(object):
|
| self.path = file_path
|
| self.symbolizable_path = file_path # path to use for symbolization
|
| self.frames_by_address = collections.defaultdict(list)
|
| + self.skip_symbolization = False
|
|
|
|
|
| def ResolveSymbolizableFiles(processes):
|
| @@ -1009,7 +1013,8 @@ def ResolveSymbolizableFiles(processes):
|
|
|
| symfile = symfile_by_path.get(region.file_path)
|
| if symfile is None:
|
| - symfile = SymbolizableFile(region.file_path)
|
| + file_path = region.file_path
|
| + symfile = SymbolizableFile(file_path)
|
| symfile_by_path[symfile.path] = symfile
|
|
|
| relative_pc = frame.pc - region.start_address
|
| @@ -1041,13 +1046,14 @@ class Symbolizer(object):
|
| self.binary = 'addr2line'
|
| self.symbolizer_path = FindInSystemPath(self.binary)
|
|
|
| - def _SymbolizeLinuxAndAndroid(self, symfile, unsymbolized_name):
|
| + def _SymbolizeLinuxAndAndroid(self, symfile):
|
| def _SymbolizerCallback(sym_info, frames):
|
| # Unwind inline chain to the top.
|
| while sym_info.inlined_by:
|
| sym_info = sym_info.inlined_by
|
|
|
| - symbolized_name = sym_info.name if sym_info.name else unsymbolized_name
|
| + symbolized_name = (sym_info.name if sym_info.name else
|
| + '<{}>'.format(symfile.path))
|
| for frame in frames:
|
| frame.name = symbolized_name
|
|
|
| @@ -1121,13 +1127,25 @@ class Symbolizer(object):
|
| # the function name as line info is not always available.
|
| frame.name = stdout_data[i * 2]
|
|
|
| - def Symbolize(self, symfile, unsymbolized_name):
|
| + def SymbolizeSymfile(self, symfile):
|
| + if symfile.skip_symbolization:
|
| + for address, frames in symfile.frames_by_address.iteritems():
|
| + unsymbolized_name = ('<' + os.path.basename(symfile.symbolizable_path)
|
| + + '>')
|
| + # Only append the address if there's a library.
|
| + if symfile.symbolizable_path != _UNNAMED_FILE:
|
| + unsymbolized_name += ' + ' + str(hex(address))
|
| +
|
| + for frame in frames:
|
| + frame.name = unsymbolized_name
|
| + return
|
| +
|
| if self.is_mac:
|
| self._SymbolizeMac(symfile)
|
| elif self.is_win:
|
| self._SymbolizeWin(symfile)
|
| else:
|
| - self._SymbolizeLinuxAndAndroid(symfile, unsymbolized_name)
|
| + self._SymbolizeLinuxAndAndroid(symfile)
|
|
|
| def IsSymbolizableFile(self, file_path):
|
| if self.is_win:
|
| @@ -1154,9 +1172,6 @@ def SymbolizeFiles(symfiles, symbolizer):
|
| print (' ' + message).format(*args)
|
|
|
| for symfile in symfiles:
|
| - unsymbolized_name = '<{}>'.format(
|
| - symfile.path if symfile.path else 'unnamed')
|
| -
|
| problem = None
|
| if not os.path.isabs(symfile.symbolizable_path):
|
| problem = 'not a file'
|
| @@ -1165,20 +1180,16 @@ def SymbolizeFiles(symfiles, symbolizer):
|
| elif not symbolizer.IsSymbolizableFile(symfile.symbolizable_path):
|
| problem = 'file is not symbolizable'
|
| if problem:
|
| - _SubPrintf("Won't symbolize {} PCs for '{}': {}.",
|
| - len(symfile.frames_by_address),
|
| + _SubPrintf("Problem with '{}': {}.",
|
| symfile.symbolizable_path,
|
| problem)
|
| - for frames in symfile.frames_by_address.itervalues():
|
| - for frame in frames:
|
| - frame.name = unsymbolized_name
|
| - continue
|
| + symfile.skip_symbolization = True
|
|
|
| _SubPrintf('Symbolizing {} PCs from {}...',
|
| len(symfile.frames_by_address),
|
| symfile.symbolizable_path)
|
|
|
| - symbolizer.Symbolize(symfile, unsymbolized_name)
|
| + symbolizer.SymbolizeSymfile(symfile)
|
|
|
|
|
| # Matches Android library paths, supports both K (/data/app-lib/<>/lib.so)
|
| @@ -1213,7 +1224,8 @@ def RemapAndroidFiles(symfiles, output_path):
|
| symfile.symbolizable_path = 'android://{}'.format(symfile.path)
|
|
|
|
|
| -def RemapMacFiles(symfiles, symbol_base_directory, version):
|
| +def RemapMacFiles(symfiles, symbol_base_directory, version,
|
| + only_symbolize_chrome_symbols):
|
| suffix = ("Google Chrome Framework.dSYM/Contents/Resources/DWARF/"
|
| "Google Chrome Framework")
|
| symbol_sub_dir = os.path.join(symbol_base_directory, version)
|
| @@ -1222,8 +1234,11 @@ def RemapMacFiles(symfiles, symbol_base_directory, version):
|
| for symfile in symfiles:
|
| if symfile.path.endswith("Google Chrome Framework"):
|
| symfile.symbolizable_path = symbolizable_path
|
| + elif only_symbolize_chrome_symbols:
|
| + symfile.skip_symbolization = True
|
|
|
| -def RemapWinFiles(symfiles, symbol_base_directory, version, is64bit):
|
| +def RemapWinFiles(symfiles, symbol_base_directory, version, is64bit,
|
| + only_symbolize_chrome_symbols):
|
| folder = "win64" if is64bit else "win"
|
| symbol_sub_dir = os.path.join(symbol_base_directory,
|
| "chrome-" + folder + "-" + version)
|
| @@ -1232,8 +1247,10 @@ def RemapWinFiles(symfiles, symbol_base_directory, version, is64bit):
|
| symbols = image + ".pdb"
|
| if os.path.isfile(image) and os.path.isfile(symbols):
|
| symfile.symbolizable_path = image
|
| + elif only_symbolize_chrome_symbols:
|
| + symfile.skip_symbolization = True
|
|
|
| -def Symbolize(options, trace, symbolizer):
|
| +def SymbolizeTrace(options, trace, symbolizer):
|
| symfiles = ResolveSymbolizableFiles(trace.processes)
|
|
|
| # Android trace files don't have any indication they are from Android.
|
| @@ -1246,11 +1263,16 @@ def Symbolize(options, trace, symbolizer):
|
|
|
|
|
| if not trace.is_chromium:
|
| + # A non-chromium trace probably is not coming from the current machine.
|
| + # Don't attempt to symbolize system symbols, as that will produce the wrong
|
| + # results.
|
| + options.only_symbolize_chrome_symbols = True
|
| if symbolizer.is_mac:
|
| - RemapMacFiles(symfiles, options.symbol_base_directory, trace.version)
|
| + RemapMacFiles(symfiles, options.symbol_base_directory, trace.version,
|
| + options.only_symbolize_chrome_symbols)
|
| if symbolizer.is_win:
|
| RemapWinFiles(symfiles, options.symbol_base_directory, trace.version,
|
| - trace.is_64bit)
|
| + trace.is_64bit, options.only_symbolize_chrome_symbols)
|
|
|
| SymbolizeFiles(symfiles, symbolizer)
|
|
|
| @@ -1262,7 +1284,8 @@ def OpenTraceFile(file_path, mode):
|
| return open(file_path, mode + 't')
|
|
|
|
|
| -def FetchAndExtractSymbolsMac(symbol_base_directory, version):
|
| +def FetchAndExtractSymbolsMac(symbol_base_directory, version,
|
| + cloud_storage_bucket):
|
| def GetLocalPath(base_dir, version):
|
| return os.path.join(base_dir, version + ".tar.bz2")
|
| def GetSymbolsPath(version):
|
| @@ -1279,7 +1302,6 @@ def FetchAndExtractSymbolsMac(symbol_base_directory, version):
|
| bzip_path = GetLocalPath(symbol_base_directory, version)
|
| if not os.path.isfile(bzip_path):
|
|
|
| - cloud_storage_bucket = "chrome-unsigned"
|
| if not cloud_storage.Exists(cloud_storage_bucket, GetSymbolsPath(version)):
|
| print "Can't find symbols on GCS."
|
| return False
|
| @@ -1290,10 +1312,10 @@ def FetchAndExtractSymbolsMac(symbol_base_directory, version):
|
| return True
|
|
|
|
|
| -def FetchAndExtractSymbolsWin(symbol_base_directory, version, is64bit):
|
| +def FetchAndExtractSymbolsWin(symbol_base_directory, version, is64bit,
|
| + cloud_storage_bucket):
|
| def DownloadAndExtractZipFile(zip_path, source, destination):
|
| if not os.path.isfile(zip_path):
|
| - cloud_storage_bucket = "chrome-unsigned"
|
| if not cloud_storage.Exists(cloud_storage_bucket, source):
|
| print "Can't find symbols on GCS."
|
| return False
|
| @@ -1353,6 +1375,16 @@ def main(args):
|
| '--output-directory',
|
| help='The path to the build output directory, such as out/Debug.')
|
|
|
| + parser.add_argument(
|
| + '--only-symbolize-chrome-symbols',
|
| + action='store_true',
|
| + help='Prevents symbolization of non-Chrome [system] symbols.')
|
| +
|
| + parser.add_argument(
|
| + '--cloud-storage-bucket', default='chrome-unsigned',
|
| + help="Bucket that holds symbols for official Chrome builds. "
|
| + "Used by tests, which don't have access to the default bucket.")
|
| +
|
| home_dir = os.path.expanduser('~')
|
| default_dir = os.path.join(home_dir, "symbols")
|
| parser.add_argument(
|
| @@ -1385,15 +1417,17 @@ def main(args):
|
| has_symbols = False
|
| if symbolizer.is_mac:
|
| has_symbols = FetchAndExtractSymbolsMac(options.symbol_base_directory,
|
| - trace.version)
|
| + trace.version,
|
| + options.cloud_storage_bucket)
|
| if symbolizer.is_win:
|
| has_symbols = FetchAndExtractSymbolsWin(options.symbol_base_directory,
|
| - trace.version, trace.is_64bit)
|
| + trace.version, trace.is_64bit,
|
| + options.cloud_storage_bucket)
|
| if not has_symbols:
|
| print 'Cannot fetch symbols from GCS'
|
| return False
|
|
|
| - Symbolize(options, trace, symbolizer)
|
| + SymbolizeTrace(options, trace, symbolizer)
|
|
|
| if trace.modified:
|
| trace.ApplyModifications()
|
| @@ -1408,6 +1442,7 @@ def main(args):
|
| json.dump(trace.node, trace_file)
|
| else:
|
| print 'No modifications were made - not updating the trace file.'
|
| + return True
|
|
|
|
|
| if __name__ == '__main__':
|
|
|