Lazily find the ELF and addr2line paths.
(self)
| 172 | # ------------------------------------------------------------------ |
| 173 | |
| 174 | def _resolve_tools(self) -> None: |
| 175 | """Lazily find the ELF and addr2line paths.""" |
| 176 | if self._resolved: |
| 177 | return |
| 178 | self._resolved = True |
| 179 | |
| 180 | # --- ELF --- |
| 181 | if self._use_fbuild: |
| 182 | elf_candidates = [ |
| 183 | self._build_dir |
| 184 | / ".fbuild" |
| 185 | / "build" |
| 186 | / self._environment |
| 187 | / "firmware.elf", |
| 188 | ] |
| 189 | else: |
| 190 | elf_candidates = [ |
| 191 | self._build_dir |
| 192 | / ".fbuild" |
| 193 | / "build" |
| 194 | / self._environment |
| 195 | / "firmware.elf", |
| 196 | self._build_dir / ".pio" / "build" / self._environment / "firmware.elf", |
| 197 | ] |
| 198 | |
| 199 | for p in elf_candidates: |
| 200 | if p.exists(): |
| 201 | self._elf_path = p |
| 202 | break |
| 203 | |
| 204 | if not self._elf_path: |
| 205 | print( |
| 206 | f"[CrashTraceDecoder] Warning: firmware.elf not found for '{self._environment}'", |
| 207 | file=sys.stderr, |
| 208 | ) |
| 209 | |
| 210 | # --- addr2line --- |
| 211 | # Try build_info.json first (fbuild). |
| 212 | build_info_path = ( |
| 213 | self._build_dir |
| 214 | / ".fbuild" |
| 215 | / "build" |
| 216 | / self._environment |
| 217 | / "build_info.json" |
| 218 | ) |
| 219 | if build_info_path.exists(): |
| 220 | self._addr2line = find_addr2line_from_build_info(build_info_path) |
| 221 | |
| 222 | # Fall back to PlatformIO toolchain search. |
| 223 | if not self._addr2line: |
| 224 | self._addr2line = find_addr2line() |
| 225 | |
| 226 | if not self._addr2line: |
| 227 | print( |
| 228 | "[CrashTraceDecoder] Warning: addr2line not found; crash traces will not be decoded", |
| 229 | file=sys.stderr, |
| 230 | ) |
| 231 |
no test coverage detected