Merge branch 'bugfix/fix_ignoring_provided_corefiles_in_espcoredump' into 'release/v4.4'

tools: fix the missing chip type in esp-coredump when the board is not connected

See merge request espressif/esp-idf!22079
This commit is contained in:
Roland Dobai
2023-02-17 23:40:15 +08:00

View File

@ -9,15 +9,16 @@ import subprocess
import sys import sys
from shutil import copyfile from shutil import copyfile
import serial
from construct import GreedyRange, Int32ul, Struct from construct import GreedyRange, Int32ul, Struct
from corefile import RISCV_TARGETS, SUPPORTED_TARGETS, XTENSA_TARGETS, __version__, xtensa from corefile import RISCV_TARGETS, SUPPORTED_TARGETS, XTENSA_TARGETS, __version__, xtensa
from corefile.elf import TASK_STATUS_CORRECT, ElfFile, ElfSegment, ESPCoreDumpElfFile, EspTaskStatus from corefile.elf import TASK_STATUS_CORRECT, ElfFile, ElfSegment, ESPCoreDumpElfFile, EspTaskStatus
from corefile.gdb import EspGDB from corefile.gdb import EspGDB
from corefile.loader import ESPCoreDumpFileLoader, ESPCoreDumpFlashLoader from corefile.loader import ESPCoreDumpFileLoader, ESPCoreDumpFlashLoader, EspCoreDumpVersion
from pygdbmi.gdbcontroller import DEFAULT_GDB_TIMEOUT_SEC from pygdbmi.gdbcontroller import DEFAULT_GDB_TIMEOUT_SEC
try: try:
from typing import Optional, Tuple from typing import Optional, Tuple, Union
except ImportError: except ImportError:
# Only used for type annotations # Only used for type annotations
pass pass
@ -83,21 +84,50 @@ def get_core_dump_elf(e_machine=ESPCoreDumpFileLoader.ESP32):
return core_filename, target, temp_files # type: ignore return core_filename, target, temp_files # type: ignore
def get_target(): # type: () -> str def get_chip_version(note_segments): # type: (list) -> Union[int, None]
if args.chip != 'auto': for segment in note_segments:
for sec in segment.note_secs:
if sec.type == ESPCoreDumpElfFile.PT_INFO:
ver_bytes = sec.desc[:4]
return int((ver_bytes[3] << 8) | ver_bytes[2])
return None
def get_target(chip_version=None): # type: (Optional[int]) -> str
target = args.chip
if target != 'auto':
return args.chip # type: ignore return args.chip # type: ignore
inst = esptool.ESPLoader.detect_chip(args.port, args.baud) if chip_version is not None:
return inst.CHIP_NAME.lower().replace('-', '') # type: ignore if chip_version == EspCoreDumpVersion.ESP32:
return 'esp32'
if chip_version == EspCoreDumpVersion.ESP32S2:
return 'esp32s2'
if chip_version == EspCoreDumpVersion.ESP32S3:
return 'esp32s3'
if chip_version == EspCoreDumpVersion.ESP32C3:
return 'esp32c3'
try:
inst = esptool.ESPLoader.detect_chip(args.port, args.baud)
except serial.serialutil.SerialException:
print('Unable to identify the chip type. Please use the --chip option to specify the chip type or '
'connect the board and provide the --port option to have the chip type determined automatically.')
exit(0)
else:
target = inst.CHIP_NAME.lower().replace('-', '')
return target # type: ignore
def get_gdb_path(target=None): # type: (Optional[str]) -> str def get_gdb_path(target): # type: (Optional[str]) -> str
if args.gdb: if args.gdb:
return args.gdb # type: ignore return args.gdb # type: ignore
if target is None:
target = get_target()
if target in XTENSA_TARGETS: if target in XTENSA_TARGETS:
# For some reason, xtensa-esp32s2-elf-gdb will report some issue. # For some reason, xtensa-esp32s2-elf-gdb will report some issue.
# Use xtensa-esp32-elf-gdb instead. # Use xtensa-esp32-elf-gdb instead.
@ -107,13 +137,10 @@ def get_gdb_path(target=None): # type: (Optional[str]) -> str
raise ValueError('Invalid value: {}. For now we only support {}'.format(target, SUPPORTED_TARGETS)) raise ValueError('Invalid value: {}. For now we only support {}'.format(target, SUPPORTED_TARGETS))
def get_rom_elf_path(target=None): # type: (Optional[str]) -> str def get_rom_elf_path(target): # type: (Optional[str]) -> str
if args.rom_elf: if args.rom_elf:
return args.rom_elf # type: ignore return args.rom_elf # type: ignore
if target is None:
target = get_target()
return '{}_rom.elf'.format(target) return '{}_rom.elf'.format(target)
@ -123,6 +150,11 @@ def dbg_corefile(): # type: () -> Optional[list[str]]
""" """
exe_elf = ESPCoreDumpElfFile(args.prog) exe_elf = ESPCoreDumpElfFile(args.prog)
core_elf_path, target, temp_files = get_core_dump_elf(e_machine=exe_elf.e_machine) core_elf_path, target, temp_files = get_core_dump_elf(e_machine=exe_elf.e_machine)
core_elf = ESPCoreDumpElfFile(core_elf_path)
if target is None:
chip_version = get_chip_version(core_elf.note_segments)
target = get_target(chip_version)
rom_elf_path = get_rom_elf_path(target) rom_elf_path = get_rom_elf_path(target)
rom_sym_cmd = load_aux_elf(rom_elf_path) rom_sym_cmd = load_aux_elf(rom_elf_path)
@ -161,6 +193,11 @@ def info_corefile(): # type: () -> Optional[list[str]]
if note_sec.type == ESPCoreDumpElfFile.PT_TASK_INFO and 'TASK_INFO' in note_sec.name.decode('ascii'): if note_sec.type == ESPCoreDumpElfFile.PT_TASK_INFO and 'TASK_INFO' in note_sec.name.decode('ascii'):
task_info_struct = EspTaskStatus.parse(note_sec.desc) task_info_struct = EspTaskStatus.parse(note_sec.desc)
task_info.append(task_info_struct) task_info.append(task_info_struct)
if target is None:
chip_version = get_chip_version(core_elf.note_segments)
target = get_target(chip_version=chip_version)
print('===============================================================') print('===============================================================')
print('==================== ESP32 CORE DUMP START ====================') print('==================== ESP32 CORE DUMP START ====================')
rom_elf_path = get_rom_elf_path(target) rom_elf_path = get_rom_elf_path(target)