Master Tracealyzer with ESP-IDF
Getting Started with Tracealyzer on ESP-IDF
Integrate TraceRecorder, capture your first ESP-IDF trace, and analyze it in Tracealyzer.
Step 1
Integrate TraceRecorder
Step 2
Configure Tracing
Step 3
Capture Your First Trace
Capture your first trace and see how your ESP-IDF application executes.
Prerequisites
Before you begin
- Install Tracealyzer. If you haven’t done so, see detailed instructions here
- Existing ESP-IDF application
- ESP-IDF application builds and runs
- Target/debug connection available
Step 1: Add TraceRecorder
Integrate TraceRecorder into Your Project
Add TraceRecorder
- Add the TraceRecorder source files to your project and make sure they are compiled by making the following adjustments in your CMakeLists.txt:
- Add TraceRecorder by adding:
set(EXTRA_COMPONENT_DIRS <TraceRecorderPath>/kernelports/ESP-IDF_FreeRTOS) - Ensure MINIMAL_BUILD is disabled. If not, ensure to comment out:
idf_build_set_property(MINIMAL_BUILD ON)
- Add TraceRecorder by adding:
Configure TraceRecorder
- No action needed
Start TraceRecorder
- Start by rebuilding your application, by so, the TraceRecorder settings will appear in menuconfig.
- Open the menuconfig by running idf.py menuconfig (or use the ESP-IDF Explorer tab in VS Code)
- Navigate to Percepio TraceRecorder and enable the Enable Percepio TraceRecorder option (if it can’t be found please try to make a clean rebuild)
For complete TraceRecorder Integration details and advanced configuration, see the detailed TraceRecorder for ESP-IDF reference guide.
Step 2: Configure Tracing
Configure Tracing
Initial setup
You’ll begin by selecting a capture method that suits your needs, either Snapshot or Streaming. Each method offers unique benefits, so consider your requirements carefully before proceeding.
-
Snapshot: Store trace data in target RAM and retrieve it later by utilizing the RingBuffer stream port.
-
Streaming: Continuously transfer trace data to Tracealyzer using a stream port such as J-Link RTT, TCP/IP etc.
Recommended: Capture your first trace with Snapshot
Snapshot tracing is the simplest way to verify that TraceRecorder is working. It stores the latest trace data in target RAM using the RingBuffer stream port.
Need long-running or live traces?
Use Streaming instead.
Snapshot
Run → Halt → Save Snapshot → Open in Tracealyzer
Make the following configurations in menuconfig (as described above)
Ensure the StreamPort option is set to “Ring Buffer“
This minimal configuration will allow you to capture essential trace data without overwhelming your system resources.
- Ring Buffer Size: decides the size of the trace buffer that is stored in RAM. A larger buffer stores more trace history but uses more RAM. Start with the default/recommended value of 10240 bytes and increase it if you need a longer trace.
- Ring Buffer Mode: defines what should happen when the buffer get’s full. Set it to either of:
-
- Overwrite: for continuously recording and always store the last events
- Stop: for stopping when the buffer is full
After your application has run, halt the target and store the RingBuffer content to your host. Instructions for how to achieve this in an easy manner may be found under “Capture Your First Trace” below.
Streaming
Run → Continously Capture in Tracealyzer → Stop
Streaming reduces the limitation imposed by the target’s RAM because trace data is continuously transferred to the host. The practical trace length and reliability still depend on the transport and its available bandwidth. To setup streaming you will:
- Start by selecting a method for your data streaming
Streaming method Typical use ESP-IDF AppTrace Trax interface J-Link RTT Debug probe TCP/IP Network-connected target ITM ARM Cortex-M + debugger
Other stream ports See stream-port documentation - Select the desired method as StreamPort in menuconfig
- Ensure that your target streaming settings are matched in the Tracealyzer application
For all the details of streaming configuration, see FreeRTOS Trace Streaming.
Step 3: Trace Capture
Capture Your First Trace
Snapshot
- VS Code
- STM32CubeIDE
- GDB or Eclipse
- Renesas e2 studiot
- IAR Embedded Workbench for Arm
- Lauterbach TRACE32
- Other Application Notes
Streaming
Opening the Trace
A successful trace should show recorded task execution, interrupts and other system events in the timeline.
If the trace is empty or doesn’t open correctly, see Troubleshooting.
Using Your Trace
-
Task scheduling — See when tasks execute, block and resume.
-
CPU usage — Identify tasks consuming significant CPU time.
-
Timing — Find long execution times and unexpected delays.
-
Interrupts — Understand how interrupts affect task execution.
-
User events — Correlate trace data with application-specific behavior and custom events/logs. All synchronized into one execution timeline.
To learn more about using Tracealyzer, see Tracealyzer Features and Capabilities.