Skip navigation

Ozone - Instruction Trace

Record, analyze, and replay every executed instruction on an embedded system with J-Trace and Ozone.



With direct integration of J-Trace, Ozone enables the use of embedded targets' trace modules to non-intrusively capture and analyze the run-time behavior of a system. The fundamental information provided by trace data is the instruction trace. Every fetched or executed instruction is recorded and provided to the debugger. With J-Trace's streaming trace capability, all of this information is available for a complete analysis.

What is Instruction Tracing?

Instruction tracing is a non-intrusive way to capture what an embedded system really executes. It is made available by a component on the target CPU, for example by the Embedded Trace Macrocell (ETM) on a Cortex-M microcontroller. The trace component captures every event on the instruction bus and makes the information about fetched and executed instructions available. The information is either stored to a small buffer in RAM, or output on the debug interface to the trace probe.

With a streaming trace probe, J-Trace, all trace information is received from the target system and immediately transferred to the debugging host computer for further analysis. While a trace buffer in target RAM or on a trace probe only offers limited information, such as the most recently executed instructions, streaming trace capability enables recording, storing, and analyzing the whole target system execution from start to end.

Instruction Tracing with Ozone

As basic information, Ozone displays the most recently executed instructions in its Instruction Trace Window. This enables analysis of what the system did last and stepping back in time.

Ozone's Instruction Trace Window displays the applications’s instruction history as a list of machine instructions, similar to a disassembly window, but in the order of execution. The instruction at the bottom of the list has been executed most recently, the instruction at the top of the list was executed least recently.

The executed instructions are grouped into call frame blocks. Each call frame block contains the set of instructions that were executed within the current frame, for example between entry of a function to the call of a sub-function. Call frame blocks can be collapsed or expanded to hide or reveal the affiliated instructions. The number of instructions executed within a particular call frame block is displayed in the block's header.

With timing information, the Instruction Trace Window also provides more detailed information about how long the execution of a block took. Depending on the granularity and accuracy of the timing information, the duration of blocks, functions, or even single instructions can be measured.

Both code windows, Source Viewer and Disassembly Window, are synchronized with the Instruction Trace Window and highlight the instruction or corresponding source line of the instruction selected int he Instruction Trace Window. This enables stepping back in time and replaying the system execution, not only on instruction level, but line by line.