Hardware-Tracing

Eine unterschätzte Debugging-Technik

3. November 2021, 8:30 Uhr | Von Felix Martin
Emulations-Adapter
Ein typischer Aufbau eines Entwicklungssystems mit einem Emulationsadapter ermöglicht Hardware-Tracing.
© iSystem

Für das Debuggen von Software gibt es bewährte Techniken wie interaktives Debugging und printf-Debugging. Eine bislang unterschätzte Technik ist Tracing – dabei verbindet es das Beste aus beiden Welten. Es gewährt Einblicke in den Ablauf der Software, ohne das Laufzeitverhalten zu beeinträchtigen.

Geht es um das Auffinden und Beheben von Fehlern oder unerwünschtem Verhalten im Code von Embedded-Geräten, denken die meisten Entwickler vermutlich zuallererst ans interaktive Debugging. Hier erhält der Entwickler mithilfe von Haltepunkten (Breakpoints), Stepping und Speicherüberwachung ein Bild vom Ablauf seiner Anwendung. Zwar zählt die Art des Debuggens zum Tagesgeschäft eines jeden Softwareentwicklers, jedoch hat sie einige inhärente Einschränkungen, insbesondere bei Embedded-Systemen. Herausfordernd hierbei: Interaktives Debugging gibt keine klare Aussage über das Echtzeitverhalten.

Eine Alternative zum interaktiven Debugging ist das »printf«-Debugging. Hier können Entwickler ihre Anwendung mit printf-Anweisungen ergänzen, damit sie an interessanten Stellen aussagekräftige Rückmeldungen des Codes erzeugt. Anschließend werden die Meldungen in einer Übersicht am PC angezeigt, so dass der Entwickler das Verhalten des Geräts verstehen kann. Ist keine Schnittstelle zum Übertragen der Meldungen vorhanden, sind alternativ zur printf-Anweisung E/A-Pins ansteuerbar. Vorteil des printf-Debuggings ist, dass es das Echtzeitverhalten einer Embedded-Anwendung nicht stört. Trotzdem ist es ein invasiver Prozess und je mehr Messinstrumente ein Entwickler hinzufügt, desto stärker beeinflusst die Methode das Laufzeitverhalten.

Das Nonplusultra wäre deshalb eine Debugging-Technik, die einen vollen Einblick in das Ausführen der Anwendung gewährt – wie das interaktive Debugging – und gleichzeitig die Echtzeit-Eigenschaften bewahrt – wie beim printf-Debugging, aber idealerweise ohne Instrumentierung.

Genau das ist Tracing: Das Erstellen einer Liste von Ereignissen mit Zeitstempeln, die das zeitliche Verhalten und den Ablauf der Anwendung darstellt. Schreib- und Lesevorgänge an globalen Variablen erzeugen eine Daten-Trace-Meldung. Das ist ein Trace-Ereignis mit der Adresse der Variablen, dem Wert, der gelesen oder geschrieben wurde, sowie dem entsprechenden Zeitstempel – das sogenannte Data-Trace.

Anweisungen erzeugen Ereignisse mit der Adresse und dem »Opcode«. Die Form der Ablaufverfolgung wird Programmablauf- oder Befehlsablaufverfolgung genannt – kurz Programmfluss-Trace. Mithilfe der Kombination von Daten-Trace und Programmfluss-Trace erhält der Entwickler einen vollständigen Einblick in das Echtzeitverhalten, beispielsweise mithilfe des Visualisierens der Daten im »winIDEA-Analyzer« von iSystem. Aber wie lässt sich ein Trace aufzeichnen?

Anbieter zum Thema

zu Matchmaker+

Trace-Techniken

Im Allgemeinen gibt es zwei Haupttechniken für das Tracing: Software-Tracing und Hardware-Tracing. Hierbei stützt sich das Software-Tracing wie das printf-Debugging auf eine Software-Instrumentierung. Die Instrumentierung erzeugt Trace-Nachrichten an interessanten Punkten und puffert sie im Arbeitsspeicher des Mikrocontrollers. Von dort aus werden die Daten über eine Anwendungsschnittstelle wie CAN oder Ethernet aus dem Chip heraus übertragen. Vorteil des Software-Tracings: Es ist keine spezielle Hardware nötig. Jedoch gibt es dafür Einschränkungen hinsichtlich der Anzahl der Trace-Objekte und der Trace-Dauer. Wie das printf-Debugging ist die Technik invasiv und erzeugt einen Overhead im Gerät.

Hardware-Tracing hingegen basiert auf einem dedizierten On-Chip-Trace-Modul zum Aufzeichnen von Ereignissen. Die Ereignisse werden entweder über die Debug-Schnittstelle oder über eine dedizierte Trace-Schnittstelle aus dem Chip heraus gesendet. Ein großer Vorteil am Hardware-Tracing ist, dass es keinen Overhead erzeugt und die Anwendung nicht unterbricht. Außerdem ermöglicht es eine große Anzahl von Trace-Objekten und im Vergleich zum Software-Tracing deutlich längere Aufzeichnungen: Je nach Anwendungsfall sind Trace-Dauern von mehreren Sekunden bis zu mehreren Minuten realisierbar.

Hardware-Tracing ermöglicht außerdem eine Reihe von erweiterten Anwendungsfällen wie das Debuggen der Anwendung über einen Reset, unbegrenztes Betriebssystem-Profiling, eine Code-Coverage-Analyse sowie das Aufzeichnen von Peripherie-Ereignissen wie Interrupts oder direkten Speicherzugriffen. Unbedingte Voraussetzung für ein Hardware-Tracing ist jedoch, dass es auf dem verwendeten Mikrocontroller verfügbar ist und es erfordert eine spezielle Hardware, wie einen iSystem-Debugger/Analyzer.

Der Vollständigkeit halber sollte ebenfalls erwähnt werden, dass es noch eine dritte Methode gibt: das Hybrid-Tracing. Hybrides Tracing ist jede Technik, die Elemente aus Hardware- und Software-Tracing kombiniert. Zum Beispiel erzeugt die »CoreSight System Trace Macrocell« (STM) von Arm automatisch Daten-Trace-Meldungen für Schreibvorgänge in einen dedizierten Speicherbereich. Weitere Beispiele sind der Renesas »RH850 Software-Trace« sowie die »PowerPC Ownership Trace Messages«. Man bezeichnet diese hybriden Techniken ebenfalls als Instrumentierungs-Trace.

Hardware-Tracing

Doch wie funktioniert Hardware-Tracing im Detail? Wie bereits angesprochen, basiert Hardware-Tracing auf einem speziellen On-Chip-Trace-Modul. Es verfügt über verschiedene Untermodule für das Aufzeichnen von Programmfluss-Trace, Daten-Trace und Instrumentierungs-Trace. Je nach Mikrocontroller-Architektur hat der Anwender mehr oder weniger Freiheiten bei der Konfiguration, die jedes der Submodule aufzeichnet.

Für das Debuggen von Software gibt es eine bislang unterschätzte Technik, das Tracing dabei verbindet es das Beste aus beiden Welten. Es gewährt Einblicke in den Ablauf der Software, ohne das Laufzeitverhalten zu beeinträchtigen
Bild 1: Hardware-Tracing in der Übersicht.
© iSystem

Zum Beispiel könnte er die Programmablaufverfolgung auf eine bestimmte Funktion beschränken oder lediglich bestimmte globale Variablen mit Daten-Trace aufzeichnen.

Das Tool komprimiert die aufgezeichneten Daten und verpackt sie als Trace-Nachricht. Je nach Trace-Schnittstelle verschickt der Chip die Nachricht oder speichert sie in einem Puffer und der Debugger liest sie aus. Letztendlich gelangen die Daten zu einem PC, wo ein Debugging-Tool wie iSystem winIDEA sie für die Analyse durch den Anwender aufbereitet (Bild 1).

Hierbei ist es wichtig zu verstehen, dass das On-Chip-Trace-Modul eine Komprimierung verwendet, um die Aufzeichnung für sinnvolle Zeiträume zu ermöglichen, insbesondere für die Programmablaufverfolgung. Normalerweise bedeutet das, dass lediglich Programmzählerwerte, die einen nicht-sequenziellen Programmfluss auslösen eine Trace-Meldung erzeugen – zum Beispiel Sprünge und Ausnahmen. Anschließend rekonstruiert das Debugging-Tool die vollständige Befehlsfolge auf dem Host-Computer. Zuletzt fügt das Tool – je nach Trace-Modul und Schnittstelle – den Zeitstempel entweder auf dem Chip oder über den Debugger in das Trace ein.


  1. Eine unterschätzte Debugging-Technik
  2. Trace-Schnittstellen
  3. Resets auf der Spur

Das könnte Sie auch interessieren

Verwandte Artikel

iSystem AG