diff --git a/monitor/filter_exception_decoder.py b/monitor/filter_exception_decoder.py index a34c9a5c5..43a8f7fd3 100644 --- a/monitor/filter_exception_decoder.py +++ b/monitor/filter_exception_decoder.py @@ -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 @@ -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. @@ -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 @@ -969,9 +962,7 @@ 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 "" @@ -979,9 +970,7 @@ def build_backtrace(self, line, address_match): 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) @@ -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) @@ -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 "" @@ -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)