def _ProcessSymbolOutput(self, lines):
"""Parses an addr2line symbol output and triggers the client callback."""
(_, callback_arg, _) = self._request_queue.popleft()
self.queue_size -= 1
innermost_sym_info = None
sym_info = None
for (line1, line2) in lines:
prev_sym_info = sym_info
name = line1 if not line1.startswith('?') else None
source_path = None
source_line = None
m = ELFSymbolizer.Addr2Line.SYM_ADDR_RE.match(line2)
if m:
if not m.group(1).startswith('?'):
source_path = m.group(1)
if not m.group(2).startswith('?'):
source_line = int(m.group(2))
else:
logging.warning('Got invalid symbol path from addr2line: %s', line2)
# In case disambiguation is on, and needed
was_ambiguous = False
disambiguated = False
if self._symbolizer.disambiguate:
if source_path and not posixpath.isabs(source_path):
path = self._symbolizer.disambiguation_table.get(source_path)
was_ambiguous = True
disambiguated = path is not None
source_path = path if disambiguated else source_path
# Use absolute paths (so that paths are consistent, as disambiguation
# uses absolute paths)
if source_path and not was_ambiguous:
source_path = os.path.abspath(source_path)
if source_path and self._symbolizer.strip_base_path:
# Strip the base path
source_path = re.sub('^' + self._symbolizer.strip_base_path,
self._symbolizer.source_root_path or '', source_path)
sym_info = ELFSymbolInfo(name, source_path, source_line, was_ambiguous,
disambiguated)
if prev_sym_info:
prev_sym_info.inlined_by = sym_info
if not innermost_sym_info:
innermost_sym_info = sym_info
self._processed_symbols_count += 1
self._symbolizer.callback(innermost_sym_info, callback_arg)
评论列表
文章目录