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

Unified Diff: tracing/tracing/extras/symbolizer/symbolize_trace.py

Issue 2950723002: Add an end-to-end test for symbolize_trace on macOS. (Closed)
Patch Set: lint Created 3 years, 6 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
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__':

Powered by Google App Engine
This is Rietveld 408576698