Skip to content

Commit ef14d7a

Browse files
committed
test(coredump): fix failed core dump tests
1 parent 5f3d3f5 commit ef14d7a

File tree

4 files changed

+33
-35
lines changed

4 files changed

+33
-35
lines changed

tools/test_apps/system/panic/pytest_panic.py

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,20 @@ def get_default_backtrace(config: str) -> List[str]:
112112
return [config, 'app_main', 'main_task', 'vPortTaskWrapper']
113113

114114

115+
def expect_coredump_flash_write_logs(dut: PanicTestDut, config: str) -> None:
116+
dut.expect_exact('Save core dump to flash...')
117+
if 'extram_stack' in config:
118+
dut.expect_exact('Backing up stack @')
119+
dut.expect_exact('Restoring stack')
120+
dut.expect_exact('Core dump has been saved to flash.')
121+
dut.expect('Rebooting...')
122+
123+
115124
def common_test(dut: PanicTestDut, config: str, expected_backtrace: Optional[List[str]] = None, check_cpu_reset: Optional[bool] = True,
116125
expected_coredump: Optional[Sequence[Union[str, Pattern[Any]]]] = None) -> None:
117126
if 'gdbstub' in config:
127+
if 'coredump' in config:
128+
dut.process_coredump_uart(expected_coredump, False)
118129
dut.expect_exact('Entering gdb stub now.')
119130
dut.start_gdb_for_gdbstub()
120131
frames = dut.gdb_backtrace()
@@ -130,11 +141,10 @@ def common_test(dut: PanicTestDut, config: str, expected_backtrace: Optional[Lis
130141
if 'uart' in config:
131142
dut.process_coredump_uart(expected_coredump)
132143
elif 'flash' in config:
144+
expect_coredump_flash_write_logs(dut, config)
133145
dut.process_coredump_flash(expected_coredump)
134146
elif 'panic' in config:
135-
pass
136-
137-
dut.expect('Rebooting...')
147+
dut.expect('Rebooting...')
138148

139149
if check_cpu_reset:
140150
dut.expect_cpu_reset()
@@ -219,13 +229,6 @@ def test_panic_extram_stack(dut: PanicTestDut, config: str) -> None:
219229
dut.expect_none('Guru Meditation')
220230
dut.expect_backtrace()
221231
dut.expect_elf_sha256()
222-
# Check that coredump is getting written to flash
223-
dut.expect_exact('Save core dump to flash...')
224-
# And that the stack is replaced and restored
225-
dut.expect_exact('Backing up stack @')
226-
dut.expect_exact('Restoring stack')
227-
# The caller must be accessible after restoring the stack
228-
dut.expect_exact('Core dump has been saved to flash.')
229232

230233
if dut.target == 'esp32':
231234
# ESP32 External data memory range [0x3f800000-0x3fc00000)
@@ -882,7 +885,7 @@ def test_rtc_slow_reg1_execute_violation(dut: PanicTestDut, test_func_name: str)
882885
dut.expect_gme('Memory protection fault')
883886
dut.expect(r'Read operation at address [0-9xa-f]+ not permitted \((\S+)\)')
884887
dut.expect_reg_dump(0)
885-
dut.expect_corrupted_backtrace()
888+
dut.expect_backtrace(corrupted=True)
886889
dut.expect_cpu_reset()
887890

888891

@@ -893,7 +896,7 @@ def test_rtc_slow_reg2_execute_violation(dut: PanicTestDut, test_func_name: str)
893896
dut.expect_gme('Memory protection fault')
894897
dut.expect(r'Read operation at address [0-9xa-f]+ not permitted \((\S+)\)')
895898
dut.expect_reg_dump(0)
896-
dut.expect_corrupted_backtrace()
899+
dut.expect_backtrace(corrupted=True)
897900
dut.expect_cpu_reset()
898901

899902

@@ -948,15 +951,7 @@ def test_invalid_memory_region_execute_violation(dut: PanicTestDut, test_func_na
948951
def test_gdbstub_coredump(dut: PanicTestDut) -> None:
949952
test_func_name = 'test_storeprohibited'
950953
dut.run_test_func(test_func_name)
951-
952-
dut.process_coredump_uart()
953-
954-
dut.expect_exact('Entering gdb stub now.')
955-
dut.start_gdb_for_gdbstub()
956-
frames = dut.gdb_backtrace()
957-
dut.verify_gdb_backtrace(frames, get_default_backtrace(test_func_name))
958-
dut.revert_log_level()
959-
return # don't expect "Rebooting" output below
954+
common_test(dut, 'gdbstub_coredump', get_default_backtrace(test_func_name))
960955

961956

962957
def test_hw_stack_guard_cpu(dut: PanicTestDut, cpu: int) -> None:
@@ -1019,9 +1014,7 @@ def test_capture_dram(dut: PanicTestDut, config: str, test_func_name: str) -> No
10191014
dut.expect_elf_sha256()
10201015
dut.expect_none(['Guru Meditation', 'Re-entered core dump'])
10211016

1022-
dut.expect_exact('Save core dump to flash...')
1023-
dut.expect_exact('Core dump has been saved to flash.')
1024-
dut.expect('Rebooting...')
1017+
expect_coredump_flash_write_logs(dut, config)
10251018

10261019
core_elf_file = dut.process_coredump_flash()
10271020
dut.start_gdb_for_coredump(core_elf_file)
@@ -1074,7 +1067,7 @@ def test_tcb_corrupted(dut: PanicTestDut, target: str, config: str, test_func_na
10741067
if dut.is_xtensa:
10751068
dut.expect_gme('LoadProhibited')
10761069
dut.expect_reg_dump(0)
1077-
dut.expect_corrupted_backtrace()
1070+
dut.expect_backtrace()
10781071
else:
10791072
dut.expect_gme('Load access fault')
10801073
dut.expect_reg_dump(0)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y
22
CONFIG_ESP_COREDUMP_DATA_FORMAT_BIN=y
33
CONFIG_ESP_COREDUMP_CHECKSUM_CRC32=y
4+
CONFIG_LOG_DEFAULT_LEVEL_INFO=y
45

56
# static D/IRAM usage 97%, add this to reduce
67
CONFIG_HAL_ASSERTION_DISABLE=y
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y
22
CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y
33
CONFIG_ESP_COREDUMP_CHECKSUM_SHA256=y
4+
CONFIG_LOG_DEFAULT_LEVEL_INFO=y

tools/test_apps/system/panic/test_panic_util/panic_dut.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,13 @@ def expect_none(self, pattern, **kwargs) -> None: # type: ignore
8080
except pexpect.TIMEOUT:
8181
pass
8282

83-
def expect_backtrace(self) -> None:
83+
def expect_backtrace(self, corrupted: bool = False) -> None:
8484
assert self.is_xtensa, 'Backtrace can be printed only on Xtensa'
8585
match = self.expect(r'Backtrace:( 0x[0-9a-fA-F]{8}:0x[0-9a-fA-F]{8})+(?P<corrupted> \|<-CORRUPTED)?')
86-
assert not match.group('corrupted')
87-
88-
def expect_corrupted_backtrace(self) -> None:
89-
assert self.is_xtensa, 'Backtrace can be printed only on Xtensa'
90-
self.expect_exact('Backtrace:')
91-
self.expect_exact('CORRUPTED')
86+
if corrupted:
87+
assert match.group('corrupted')
88+
else:
89+
assert match
9290

9391
def expect_stack_dump(self) -> None:
9492
assert not self.is_xtensa, 'Stack memory dump is only printed on RISC-V'
@@ -153,11 +151,16 @@ def _call_espcoredump(
153151
self.coredump_output.flush()
154152
self.coredump_output.seek(0)
155153

156-
def process_coredump_uart(self, expected: Optional[List[Union[str, re.Pattern]]] = None) -> None:
154+
def process_coredump_uart(
155+
self, expected: Optional[List[Union[str, re.Pattern]]] = None, wait_reboot: bool = True
156+
) -> None:
157157
"""Extract the core dump from UART output of the test, run espcoredump on it"""
158158
self.expect(self.COREDUMP_UART_START)
159-
res = self.expect('(.+)' + self.COREDUMP_UART_END)
160-
coredump_base64 = res.group(1).decode('utf8')
159+
uart_data = self.expect('(.+)' + self.COREDUMP_UART_END)
160+
self.expect(re.compile(r"Coredump checksum='([a-fA-F0-9]+)'"))
161+
if wait_reboot:
162+
self.expect('Rebooting...')
163+
coredump_base64 = uart_data.group(1).decode('utf8')
161164
with open(os.path.join(self.logdir, 'coredump_data.b64'), 'w') as coredump_file:
162165
logging.info('Writing UART base64 core dump to %s', coredump_file.name)
163166
coredump_file.write(coredump_base64)

0 commit comments

Comments
 (0)