ci(esp_idf_monitor): Extend test_app for ROM ELF address decoding

pull/11923/head
radim.karnis 2023-06-21 13:13:24 +02:00
rodzic 4f4c91cee3
commit 6a2a7521c8
5 zmienionych plików z 54 dodań i 16 usunięć

Wyświetl plik

@ -0,0 +1,7 @@
config TEST_ADDR_LOOKUP_IN_APP
bool "TEST_ADDR_LOOKUP_IN_APP"
default n
config TEST_ADDR_LOOKUP_IN_ROM
bool "TEST_ADDR_LOOKUP_IN_ROM"
default n

Wyświetl plik

@ -8,6 +8,7 @@
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#if CONFIG_TEST_ADDR_LOOKUP_IN_APP
static volatile bool s_initialization_done = false;
static void initialize(void)
@ -23,9 +24,13 @@ static int get_random_number(void)
}
return rand();
}
#endif // CONFIG_TEST_ADDR_LOOKUP_IN_APP
void app_main(void)
{
printf("app_main is running from 0x%x\n", (int) app_main);
#if CONFIG_TEST_ADDR_LOOKUP_IN_APP
volatile int number = get_random_number();
int *n = malloc(sizeof(int));
@ -33,10 +38,17 @@ void app_main(void)
*n = number;
printf("app_main is running from 0x%x\n", (int) app_main);
printf("Initializer function at 0x%x\n", (int) initialize);
printf("Got %d stored at 0x%x and 0x%x from a function from 0x%x\n", *n, (int) n, (int) (&number), (int) get_random_number);
printf("This is the end of the report\n");
free(n);
#endif // CONFIG_TEST_ADDR_LOOKUP_IN_APP
#if CONFIG_TEST_ADDR_LOOKUP_IN_ROM
printf("Crashing now!\n");
esp_rom_install_channel_putc(1, (void (*)(char)) abort);
esp_rom_printf("a");
#endif // CONFIG_TEST_ADDR_LOOKUP_IN_ROM
}

Wyświetl plik

@ -11,6 +11,10 @@ from pytest_embedded import Dut
@pytest.mark.generic
@pytest.mark.supported_targets
@pytest.mark.parametrize('config', [
'addr_lookup_in_app',
'addr_lookup_in_ROM',
], indirect=True)
def test_monitor_addr_lookup(config: str, dut: Dut) -> None:
# The port needs to be closed because esp_idf_monitor will connect to it
dut.serial.stop_redirect_thread()
@ -22,22 +26,35 @@ def test_monitor_addr_lookup(config: str, dut: Dut) -> None:
with open(monitor_log_path, 'w') as log, pexpect.spawn(monitor_cmd, logfile=log, timeout=5, encoding='utf-8', codec_errors='ignore') as p:
p.expect_exact('main_task: Calling app_main()')
ADDRESS = '0x[a-f0-9]{8}'
ADDRESS = r'0x[a-f0-9]{8}'
FUNC_NAME = r'[a-zA-Z_][\w]*'
p.expect(re.compile(r'app_main is running from ({})'.format(ADDRESS)))
a = p.match.group(1)
p.expect_exact('{}: app_main at'.format(a))
p.expect(re.compile(rf'app_main is running from ({ADDRESS})'))
addr = p.match.group(1)
p.expect_exact(f'{addr}: app_main at')
p.expect(re.compile(r'Initializer function at ({})'.format(ADDRESS)))
a = p.match.group(1)
p.expect_exact('{}: initialize at'.format(a))
if config == 'addr_lookup_in_app':
p.expect(re.compile(rf'Initializer function at ({ADDRESS})'))
addr = p.match.group(1)
p.expect_exact(f'{addr}: initialize at')
p.expect(re.compile(r'Got \d+ stored at ({}) and ({}) from a function from ({})'.format(ADDRESS, ADDRESS, ADDRESS)))
var1 = p.match.group(1)
var2 = p.match.group(2)
func = p.match.group(3)
match_index = p.expect([str(var1), str(var2), pexpect.TIMEOUT])
assert match_index == 2 # should be TIMEOUT because addr2line should not match addresses of variables
p.expect_exact('{}: get_random_number at'.format(func))
p.expect(re.compile(rf'Got \d+ stored at ({ADDRESS}) and ({ADDRESS}) from a function from ({ADDRESS})'))
var1 = p.match.group(1)
var2 = p.match.group(2)
func = p.match.group(3)
match_index = p.expect([str(var1), str(var2), pexpect.TIMEOUT])
assert match_index == 2 # should be TIMEOUT because addr2line should not match addresses of variables
p.expect_exact(f'{func}: get_random_number at')
p.expect_exact('This is the end of the report')
p.expect_exact('This is the end of the report')
elif config == 'addr_lookup_in_ROM':
p.expect_exact('Crashing now!')
p.expect(re.compile(rf'abort\(\) was called at PC ({ADDRESS}) on core 0'))
addr = p.match.group(1)
p.expect_exact(f'abort() was called at PC {addr} on core 0')
p.expect(re.compile(rf'({ADDRESS}): ({FUNC_NAME}) in ROM'))
addr, func = p.match.group(1), p.match.group(2)
p.expect_exact(f'{addr}: {func} in ROM')

Wyświetl plik

@ -0,0 +1 @@
CONFIG_TEST_ADDR_LOOKUP_IN_ROM=y

Wyświetl plik

@ -0,0 +1 @@
CONFIG_TEST_ADDR_LOOKUP_IN_APP=y