mirror of
https://github.com/espressif/esp-idf
synced 2025-03-09 17:19:09 -04:00
change(sysview): support single/dual core targets in heap_trace_log test
This commit is contained in:
parent
4cf553509e
commit
688b86ba24
@ -18,7 +18,15 @@ This example requires the following tools:
|
||||
NOTE: In order to run this example you need OpenOCD version `v0.10.0-esp32-20190313` or later.
|
||||
|
||||
2. [GDB](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#setup-toolchain) can be used to start and/or stop tracing automatically. To do this you need to prepare special GDB command file. Having provided with `gdbinit` file from the example project directory GDB will connect to the target, reset it, start and stop tracing automatically.
|
||||
when program hits breakpoint at `heap_trace_start`. Trace data will be saved to `/tmp/hesp_log.svdat`. Tracing will be stopped when program hits breakpoint at `heap_trace_stop`.
|
||||
|
||||
The gdbinit file includes commands to start tracing:
|
||||
```
|
||||
mon esp sysview start file:///tmp/heap_log.svdat
|
||||
# For dual-core mode uncomment the line below and comment the line above
|
||||
# mon esp sysview start file:///tmp/heap_log0.svdat file:///tmp/heap_log1.svdat
|
||||
```
|
||||
When program hits breakpoint at `heap_trace_start`, in single core mode, trace data will be saved to `/tmp/heap_log.svdat`. In dual core mode, there will be two trace data files, one for each core. `/tmp/heap_log0.svdat` and `/tmp/heap_log1.svdat`
|
||||
Tracing will be stopped when program hits breakpoint at `heap_trace_stop`.
|
||||
|
||||
3. [SEGGER SystemView tool](https://www.segger.com/products/development-tools/systemview/). By default SystemView shows only numeric values of IDs and parameters for IDF's heap messages in `Events` view. To make them pretty-looking you need to copy `SYSVIEW_FreeRTOS.txt` from the project's root directory to SystemView installation one.
|
||||
|
||||
@ -59,6 +67,10 @@ Since SystemView tool is mostly intended for OS level analysis. It allows just t
|
||||
```
|
||||
$IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -p -b build/sysview_tracing_heap_log.elf /tmp/heap_log.svdat
|
||||
```
|
||||
And in dual core mode
|
||||
```
|
||||
$IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -p -b build/sysview_tracing_heap_log.elf /tmp/heap_log0.svdat /tmp/heap_log1.svdat
|
||||
```
|
||||
|
||||
Below is the sample scripts output.
|
||||
|
||||
|
@ -7,6 +7,8 @@ maintenance flush register-cache
|
||||
tb heap_trace_start
|
||||
commands
|
||||
mon esp sysview start file:///tmp/heap_log.svdat
|
||||
# For dual-core mode uncomment the line below and comment the line above
|
||||
# mon esp sysview start file:///tmp/heap_log0.svdat file:///tmp/heap_log1.svdat
|
||||
c
|
||||
end
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
|
||||
# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
|
||||
# SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
import os.path
|
||||
import time
|
||||
@ -13,33 +13,42 @@ from pytest_embedded_idf import IdfDut
|
||||
@pytest.mark.parametrize('config', ['app_trace_jtag'], indirect=True)
|
||||
@pytest.mark.parametrize('embedded_services', ['esp,idf,jtag'], indirect=True)
|
||||
def test_examples_sysview_tracing_heap_log(idf_path: str, dut: IdfDut) -> None:
|
||||
trace_log = os.path.join(os.path.dirname(dut.gdb._logfile), 'heap_log.svdat') # pylint: disable=protected-access
|
||||
# Construct trace log paths
|
||||
trace_log = [
|
||||
os.path.join(os.path.dirname(dut.gdb._logfile), 'heap_log0.svdat') # pylint: disable=protected-access
|
||||
]
|
||||
if dut.target in ['esp32', 'esp32s3', 'esp32p4']:
|
||||
trace_log.append(os.path.join(os.path.dirname(dut.gdb._logfile), 'heap_log1.svdat')) # pylint: disable=protected-access
|
||||
|
||||
# Set up GDB
|
||||
dut.gdb.write('set width unlimited') # Don't split output lines for easy parsing
|
||||
dut.gdb.write('mon reset halt')
|
||||
dut.gdb.write('maintenance flush register-cache')
|
||||
|
||||
# Start sysview tracing
|
||||
dut.gdb.write('tb heap_trace_start')
|
||||
dut.gdb.write('commands', non_blocking=True)
|
||||
dut.gdb.write(f'mon esp sysview start file://{trace_log}', non_blocking=True)
|
||||
trace_files = ' '.join([f'file://{log}' for log in trace_log])
|
||||
dut.gdb.write(f'mon esp sysview start {trace_files}', non_blocking=True)
|
||||
dut.gdb.write('c', non_blocking=True)
|
||||
dut.gdb.write('end')
|
||||
|
||||
# Stop sysview tracing
|
||||
dut.gdb.write('tb heap_trace_stop')
|
||||
dut.gdb.write('commands', non_blocking=True)
|
||||
dut.gdb.write('mon esp sysview stop', non_blocking=True)
|
||||
dut.gdb.write('end')
|
||||
|
||||
dut.gdb.write('c', non_blocking=True)
|
||||
dut.expect('esp_apptrace: Initialized TRAX on CPU0')
|
||||
|
||||
time.sleep(1) # make sure that the sysview file has been generated
|
||||
with pexpect.spawn(' '.join([os.path.join(idf_path, 'tools', 'esp_app_trace', 'sysviewtrace_proc.py'),
|
||||
'-p',
|
||||
'-b', dut.app.elf_file,
|
||||
trace_log])) as sysviewtrace:
|
||||
# Wait for sysview files to be generated
|
||||
time.sleep(1)
|
||||
|
||||
# Process sysview trace logs
|
||||
command = [os.path.join(idf_path, 'tools', 'esp_app_trace', 'sysviewtrace_proc.py'), '-p'] + trace_log
|
||||
with pexpect.spawn(' '.join(command)) as sysviewtrace:
|
||||
sysviewtrace.expect(r'Found \d+ leaked bytes in \d+ blocks.', timeout=120)
|
||||
|
||||
# Validate GDB logs
|
||||
with open(dut.gdb._logfile) as fr: # pylint: disable=protected-access
|
||||
gdb_pexpect_proc = pexpect.fdpexpect.fdspawn(fr.fileno())
|
||||
gdb_pexpect_proc.expect_exact(
|
||||
|
@ -1,5 +1,3 @@
|
||||
# Enable single core mode by default
|
||||
CONFIG_FREERTOS_UNICORE=y
|
||||
# 1ms tick period
|
||||
CONFIG_FREERTOS_HZ=1000
|
||||
# Enable application tracing by default
|
||||
|
Loading…
x
Reference in New Issue
Block a user