Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 15 additions & 28 deletions monitor/filter_exception_decoder.py
Original file line number Diff line number Diff line change
Expand Up @@ -800,17 +800,16 @@ def _finalize_batch_entry(self, addr, lines, elf_path):
output += "\n (inlined by) " + p
self._addr_cache[(addr, elf_path)] = output

def _prefetch_addresses(self, addr_specs):
"""Pre-populate _addr_cache in batch for a list of (addr, is_return_addr)."""
def _prefetch_addresses(self, addrs):
"""Pre-populate _addr_cache in batch for a list of address strings."""
lookups = []
seen = set()
for addr, is_ret in addr_specs:
for addr in addrs:
if self.is_address_ignored(addr):
continue
lookup = "0x%08x" % (int(addr, 16) - 1) if is_ret else addr
if lookup not in seen:
seen.add(lookup)
lookups.append(lookup)
if addr not in seen:
seen.add(addr)
lookups.append(addr)

if not lookups:
return
Expand Down Expand Up @@ -899,13 +898,10 @@ def filter_addresses(self, addresses_str):
size -= 1
return addresses[:size]

def _resolve_address(self, addr, is_return_addr=False):
def _resolve_address(self, addr):
"""Resolve a single address through firmware ELF, then ROM ELF.

Applies PcAddressMatcher filtering before calling addr2line.
For return addresses (*is_return_addr=True*) the lookup address is
decremented by 1 so addr2line reports the call site rather than the
instruction after the call.

Returns:
``(decoded_string, is_rom)`` or ``(None, False)`` if unresolved.
Expand All @@ -914,9 +910,6 @@ def _resolve_address(self, addr, is_return_addr=False):
return None, False

lookup = addr
if is_return_addr:
lookup = "0x%08x" % (int(addr, 16) - 1)

int_addr = int(lookup, 16)

output = None
Expand Down Expand Up @@ -969,19 +962,15 @@ def build_backtrace(self, line, address_match):
if not addresses:
return ""

self._prefetch_addresses(
[(addr, j > 0) for j, addr in enumerate(addresses)]
)
self._prefetch_addresses(addresses)

prefix_match = self.PREFIX_RE.match(line)
prefix = prefix_match.group(0) if prefix_match is not None else ""

trace = ""
i = 0
for j, addr in enumerate(addresses):
output, is_rom = self._resolve_address(
addr, is_return_addr=(j > 0)
)
output, is_rom = self._resolve_address(addr)
if output is not None:
fmt = "%s #%-2d %s %s\n" if is_rom else "%s #%-2d %s in %s\n"
trace += fmt % (prefix, i, addr, output)
Expand All @@ -1002,14 +991,14 @@ def build_stack_trace(self, line, addresses_str):
if not addresses:
return ""

self._prefetch_addresses([(addr, True) for addr in addresses])
self._prefetch_addresses(addresses)

prefix_match = self.PREFIX_RE.match(line)
prefix = prefix_match.group(0) if prefix_match is not None else ""

trace = ""
for addr in addresses:
output, _ = self._resolve_address(addr, is_return_addr=True)
output, _ = self._resolve_address(addr)
if output is not None:
trace += "%s %s: %s\n" % (prefix, addr, output)

Expand All @@ -1027,14 +1016,14 @@ def build_register_trace(self, line, reg_matches):
Formatted annotation string, or empty string if nothing decoded.
"""
# Pre-fetch code-address registers
addr_specs = []
reg_addrs = []
for reg_name, addr in reg_matches:
if reg_name in ("EXCCAUSE", "MCAUSE"):
continue
if reg_name in self.NON_CODE_REGISTERS:
continue
addr_specs.append((addr, reg_name == "RA"))
self._prefetch_addresses(addr_specs)
reg_addrs.append(addr)
self._prefetch_addresses(reg_addrs)

prefix_match = self.PREFIX_RE.match(line)
prefix = prefix_match.group(0) if prefix_match is not None else ""
Expand Down Expand Up @@ -1062,9 +1051,7 @@ def build_register_trace(self, line, reg_matches):
if reg_name in self.NON_CODE_REGISTERS:
continue

output, _ = self._resolve_address(
addr, is_return_addr=(reg_name == "RA")
)
output, _ = self._resolve_address(addr)
if output is not None:
trace += "%s %s: %s: %s\n" % (prefix, reg_name, addr, output)

Expand Down