Finden Sie hier die Liste mit den gefilterten Produkten auf Basis Ihrer aktuellen Auswahl.

HerstellerlogoHerstellerlogoHerstellerlogoHerstellerlogoHerstellerlogoHerstellerlogoHerstellerlogoHerstellerlogoHerstellerlogoHerstellerlogoHerstellerlogoHerstellerlogo
801

 

Tracing und Visualisierung in embedded Linux Systemen

Das Debugging der Embedded-Software kann ein anspruchsvoller, zeitraubender und nicht vorhersehbarer Faktor bei der Entwicklung von Embedded-Systemen sein. Schließlich wirft das Aufdecken eines Fehlers bei der Programmausführung unmittelbar die Frage auf, wie die Software in den fehlerhaften Zustand geraten ist, welche Kombination von Eingangssignalen und zeitlichen Abläufen den Fehler verursacht hat und warum der Fehler aufgetreten ist.

Die Antworten auf diese Fragen lassen sich häufig durch Tracing finden. Beim Tracing wird das Verhalten der Software zur Laufzeit aufgezeichnet, sodass die gesammelten Trace-Daten nachträglich analysiert werden können. Auch wenn das Tracing meist während der Entwicklung erfolgt, eignet es sich ebenso gut für den Produktionseinsatz. Es ist dann ununterbrochen aktiv und kann Fehler erfassen, die nach dem Deployment auftreten. Dieses Production Tracing kann eine effektive Technik zum Detektieren insbesondere solcher Fehler sein, die nur selten vorkommen und sich deshalb mit einem Debugger nur schwierig reproduzieren lassen. Unter anderem kann es sich hier um Situationen handeln, in denen ein System langsamer reagiert als erwartet, in denen es falsche oder suboptimale Ergebnisse ausgibt oder in denen es sich aufhängt oder abstürzt.

Das Tracing kann entweder in der Hardware (d. h. im Prozessor) oder softwaremäßig erfolgen. Während das hardwarebasierte Tracing eine detaillierte Historie der verarbeiteten Befehle liefert, konzentriert sich das softwarebasierte Tracing auf ausgewählte Ereignisse, und dies üblicherweise im Betriebssystem und an wichtigen Schnittstellen auf der Applikations-Ebene.

Per Hardware generierte Traces enthalten Details zum Kontrollfluss und haben keine Rückwirkungen auf die Arbeitsweise des untersuchten Systems. Diese Technik setzt jedoch spezielles Equipment und eine für das Tracing geeignete Hardwareplattform voraus.

Das Software-Tracing kommt dagegen ohne besondere Hardware aus und lässt sich sogar in bereits im Einsatz befindlichen Produkten installieren – ähnlich wie die Blackbox in einem Flugzeug. Das Software-Tracing ermöglicht außerdem das Abspeichern von Daten, während das Hardware-Tracing in der Regel nur auf den Kontrollfluss beschränkt ist. Es trifft zu, dass das Software-Tracing die CPU beansprucht, jedoch beträgt der Overhead üblicherweise weniger als 1 %. Zum Abspeichern der Trace-Daten ist das Software-Tracing (zumindest anfangs) auf das RAM des Systems angewiesen. Normalerweise sind die RAM-Puffer jedoch konfigurierbar, sodass die richtige Balance zwischen dem Speicherbedarf und der Länge der aufgezeichneten Verarbeitungshistorie gefunden werden kann.

Besonders wichtig ist das Tracing für Systeme mit integriertem Betriebssystem. Ein zentrales Feature der Betriebssysteme ist das Multi-Threading, also die Fähigkeit zur Verarbeitung mehrerer Programme (Threads) auf einem Prozessor, indem schnell zwischen verschiedenen Verarbeitungskontexten hin- und hergeschaltet wird. Durch das Multi-Threading wird das Verhalten der Software jedoch komplexer, und der Entwickler hat weniger Kontrolle über das Verhalten zur Laufzeit, da die Verarbeitung vom Betriebssystem unterbrochen werden kann.

Tracing in Linux mit LTTng
LTTng ist eine Open-Source-Technologie für das softwarebasierte Tracing in Linux. Das höchst effiziente LTTng ist praxiserprobt und wird von den meisten Linux-Distributionen unterstützt. Der LTTng Kernel Tracer kann Scheduling-Events, Systemaufrufe, IRQs, das Speichermanagement und weitere Aktivitäten auf der Kernel-Ebene aufzeichnen. Der LTTng User-Space Tracer (LTTng-UST) dagegen zeichnet vom Anwender definierte Ereignisse im Applikations-Code auf.

Die Trace-Daten werden zunächst im RAM abgelegt, können aber fortlaufend auf eine Disk übertragen oder über eine Netzwerkverbindung an ein anderes System übermittelt werden. Eine weitere Option ist das Ablegen der Trace-Daten in einem zyklischen RAM-Puffer, in dem die jeweils ältesten Daten von den neuen überschrieben werden.

Obwohl LTTng auf dem Instrumentieren der Software beruht, erfordert es keinen Rebuild des Linux-Kernels. Stattdessen nutz LTTng so genannte Tracepoints, die sich bereits an strategisch wichtigen Stellen des Kernels befinden. Diese Tracepoints fungieren als Platzhalter für Funktionsaufrufe, die normalerweise inaktiv sind, aber von LTTng aktiviert werden können.

Mit LTTng-UST können Entwickler individuelle Ereignisse in Anwender-Applikationen und Library-Code aufzeichnen. Es ist sogar möglich, ausgewählte Funktionsaufrufe ohne Modifizieren des Quellcodes zu verfolgen. Hierzu wird einfach eine geteilte Objektdatei mit Wrapper-Funktionen erstellt. Diese enthält Tracepoints, die beim Starten der Applikation in LD_PRELOAD spezifiziert werden.

Das Funktions-Wrapping von LTTng-UST ist für den Applikations-Code völlig transparent und erfordert keine Neukompilierung. Beim ersten Aufruf schlägt die Wrapper-Funktion die Adresse der ursprünglichen Funktion nach und legt sie in einem Funktionszeiger ab.

Visualisierung von LTTng-Traces in Tracealyzer
Da LTTng binäre Datendateien ausgibt, wird für die Auswertung ein Tool benötigt. Grundsätzlich könnte man die Trace-Daten mit Babeltrace in Textdateien umwandeln, jedoch es ist schwierig, angesichts des enormen Umfangs an Trace-Daten im Textformat den Überblick zu behalten. Deutlich vereinfacht wird die Analyse durch ein Visualisierungs-Tool, denn das menschliche Gehirn kann Muster in Bildern wesentlich leichter erkennen als in Textdaten.

Die schwedische Firma Percepio AB hat unter dem Namen Tracealyzer  eine Familie von Trace-Visualisierungstools entwickelt. Tracealyzer for Linux  ist für die Visualisierung von LTTng-Trace-Daten konzipiert und stellt im Interesse einer einfacheren Auswertung mehrere grafische Ansichten zur Verfügung. Tracealyzer erkennt und markiert Abhängigkeiten zwischen zusammenhängenden Ereignissen in den Trace-Daten (z. B. das Senden und Empfangen eines Semaphorsignals). Durch das Markieren solcher Abhängigkeiten lässt sich das Verhalten des Betriebssystems leichter verstehen (z. B. weshalb einige Threads blockiert und andere getriggert werden).

Die Haupt-Traceansicht von Tracealyzer stellt die Ereignisse (z. B. Systemaufrufe) als farblich codierte Labels entlang einer vertikalen Zeitachse dar. Diese Labels lassen sich auf verschiedene Weise filtern und werden automatisch so ausgerichtet, dass es zu keinen Überschneidungen kommt. Die Hintergrundfarbe der Labels kennzeichnet den Status und den Typ der Verarbeitung. Zum Beispiel werden rote Labels für Systemaufrufe verwendet, die den aufrufenden Thread anhalten. Anwenderspezifische Applikations-Ereignisse aus LTTng-UST lassen sich so konfigurieren, dass sie entweder als Dienstaufrufe (z. B. malloc) oder als Anwender-Ereignisse (generische Debug-Meldungen) erscheinen.

Neben der Hauptansicht von Tracealyzer gibt es mehr als 20 weitere Ansichten, die Auskunft über die CPU-Auslastung, Reaktionszeiten, Kernel-Blockierungen, die Scheduling-Intensität, Kernel-Aufrufe und andere im Fokus stehende Ereignisse geben. Anwenderspezifische Ereignisse können separat in einer Text-Log-Ansicht dargestellt werden, und die Argumente von Anwender-Ereignissen lassen sich als Signal-Plots visualisieren. Sämtliche Ansichten sind außerdem miteinander verknüpft: durch Anklicken einer Task, eines Ereignisses oder eines Datenpunkts erscheint somit eine neue Ansicht, in der das angeklickte Element markiert ist. Diese Verknüpfung erleichtert den Umgang mit mehreren Ansichten bei der Untersuchung eines bestimmten Intervalls im Trace.

Zusammenfassung
Das Tracing ist ein wirkungsvolles Hilfsmittel zum Analysieren von Multi-Threaded-Softwaresystemen. In Linux erfolgt das Tracing mit LTTng, einer ausgereiften und bewährten Open-Source-Lösung. Percepio Tracealyzer for Linux ermöglicht das Visualisieren von LTTng-Trace-Daten mithilfe mehrerer, miteinander verknüpfter grafischer Ansichten. Tracealyzer erleichtert Softwareentwicklern den Zugang zu einem großen Umfang dicht gepackter Trace-Daten, sodass das Tracing noch effektiver genutzt werden kann. Tracealyzer unterstützt die Entwickler beim Verstehen komplexer Trace-Daten, beim Detektieren von Fehlern und beim Feinabstimmen der Performance, sodass unter dem Strich bessere Software entsteht.