Johan Kraft, PhD, CEO und Gründer von Percepio
Um schneller mit qualitativ hochwertigen intelligenten Produkten auf den Markt kommen zu können, brauchen Unternehmen tieferen Einblick in die „dunkle Seite des Codes“, also das tatsächliche Verhalten des gesamten Softwaresystems.
Zwischen dem erwünschten und dem tatsächlichen Verhalten können enorme Unterschiede bestehen, die sich nicht aus dem Quellcode ablesen lassen und mit Funktionstests nur schwierig aufzudecken sind. Sobald Anwendungen an Komplexität gewinnen, wächst die Herausforderung für Entwickler von Multithreaded-Embedded-Software, die auf einem RTOS oder einem Linux-Kernel läuft.
Nachfolgend werden fünf bewährte Maßnahmen beschrieben, mit denen sich mehr Einblick in das Echtzeitverhalten auf der System-Ebene gewinnen lässt, um die Produktqualität zu steigern und die Entwicklung zu beschleunigen.
1. Visuelle Zeitleiste zur Fehlererkennung nutzen
Softwarefehler, die beim Ausführen eines Multithreaded-Systems auftreten, sind oft schwer zu beheben. Zum Glück lassen sich Probleme und Unklarheiten durch bessere Einblicke während des Debuggings reduzieren. Diese erleichtern zudem das Aufdecken der Grundursachen, sodass die Fehler ordnungsgemäß behoben werden können und das Debugging weniger Zeit beansprucht. Die Möglichkeit, sich die Software-Ausführung auf einer visuellen Zeitleiste anzeigen zu lassen, ist in vielen Szenarien hilfreich – unter anderem dann, wenn sich anhand der ursprünglichen Symptome nicht bestimmen lässt, wo genau der Fehler zu lokalisieren ist. Oder wenn das Problem schwierig zu reproduzieren ist. Oder wenn die Verwendung traditioneller Debugging-Tools ausscheidet, da diese die Verarbeitung unterbrechen würden.
Wie steht es mit dem Debugging per printf? Die althergebrachte Praxis, zu Debugging-Zwecken print-Anweisungen in den Applikationscode einzufügen, ist riskant, intrusiv und nicht auf komplexere Applikationen und schnellere Prozessoren skalierbar. Die printf-Funktion ist nicht für diesen Zweck gedacht und mit mehreren Millisekunden pro Message meist auch recht langsam. Im Gegensatz dazu stützt sich die visuelle Trace-Diagnose auf optimierte Lösungen für das Software-Tracing und ist etwa 100-mal schneller als printf-Aufrufe, sodass ohne spürbare Auswirkungen wesentlich mehr Informationen erfasst werden können. Hinzu kommt, dass es mit Datenvisualisierungs-Techniken ein Leichtes ist, Software-Traces in aussagefähige Erkenntnisse zu verwandeln.
2. Schwer greifbare Probleme durch Überwachung von Systemtests erfassen
Das fortlaufende Live-Streaming von Trace-Daten gibt Entwicklern die Möglichkeit, über lange Zeitspannen hinweg ein vollständiges Bild der Software aufzuzeichnen und zu visualisieren, um schwer fassbare Softwarefehler aufzudecken, die sonst schwierig zu reproduzieren und zu beseitigen wären. Auf diese Weise lassen sich etwaige Unstimmigkeiten in den Trace-Aufzeichnungen erfassen und ihre Ursachen ermitteln. Ebenso lässt sich herausfinden, weshalb ein System nach einem mehrstündigen Stresstest abstürzt. Die visuelle Trace-Diagnose mit Percepio® Tracealyzer® bietet zum Beispiel die Möglichkeit, live eine animierte Ansicht des Laufzeitsystems zu sehen, Anomalien in den abstrakten visuellen Darstellungen und Statistiken zu erkennen und sich daraufhin zu den jeweiligen Ereignissen vorzuarbeiten, um genau zu ermitteln, was passiert ist.
3. Softwaredesign verbessern und höhere Produktqualität bzw. Kostensenkungen erzielen
Einige Entwicklungsprojekte geraten in eine Art „Debugging-Hölle“, ein häufiges Szenario, in dem ein massiver Debugging-Aufwand zum Bremsklotz für das gesamte Projekt wird. Oft tragen Abweichungen von bewährten Praktiken beim Softwaredesign und bei der RTOS-Applikationsentwicklung wesentlich hierzu bei. Beispiele sind ungeeignete Task-Prioritäten, starke Schwankungen beim Timing der Software und übermäßig viele Abhängigkeiten zwischen den Tasks. Derartige Probleme können zu einem komplexen und chaotischen Systemverhalten mit unzureichender Prüfbarkeit führen, was wiederum das Risiko für schwer greifbare Bugs erhöht, die sich bis in die fertigen Produkte hinein einer Aufdeckung entziehen.
Die visuelle Trace-Diagnose hilft den Entwicklern, das Softwaredesign zu analysieren und zu verbessern sowie ein stabiles, zuverlässiges Systemverhalten zu gewährleisten. Werden Fehler im Softwaredesign frühzeitiger erkannt, sind zu ihrer Behebung weniger Änderungen nötig und das Risiko für Fehler in den ausgelieferten Produkten wird geringer. Überdies können Verbesserungen am Softwaredesign auch die Leistungsfähigkeit und Reaktionsschnelligkeit des Systems entscheidend verbessern. Dies wiederum kann es möglich machen, kosteneffektivere Prozessoren zu wählen, um die Materialkosten zu senken oder durch Absenken der Taktfrequenz die Batterielebensdauer zu verlängern.
4. Timing und Performance während des gesamten Projekts verifizieren
Am besten misst man die Timing- und Performance-Parameter so früh wie möglich, damit sich etwaige Probleme noch vor der Auslieferung beheben lassen. Dies ist von entscheidender Bedeutung für Echtzeitsysteme mit expliziten Timing-Vorgaben, aber auch für die Nutzererfahrung anderer Applikationen. Schließlich möchte niemand eine schleppend reagierende Touch-Bedienoberfläche oder einen langsamen WLAN-Router haben. Die Ursachen hierfür sind aber aus dem Quellcode häufig nicht ersichtlich und der Umstieg auf einen schnelleren Prozessor hilft nicht unbedingt, wenn die eigentliche Ursache im Softwaredesign liegt.
Die visuelle Trace-Diagnose macht es einfach, die Ursachen von Anomalien aufzuzeigen und die Timing-Eigenschaften, die Speicherbelegung und die CPU-Auslastung der Software zu messen. Leichtere Einhaltung der Echtzeit-Vorgaben, bessere Applikations-Performance und höhere Kundenzufriedenheit sind nur ein paar Beispiele für die zahlreichen Vorteile dieser Vorgehensweise.
5. Breiten Zugang zu Diagnosefunktionen sichern
Die visuelle Trace-Diagnose kommt ohne zusätzliche Hardware aus, denn sie stützt sich nur auf Softwareintegration und die existierende Hardware der Applikation. Dies macht es möglich, sie standardmäßig in das Softwaresystem zu integrieren, sodass sie von den Entwicklern während der gesamten Entwicklungs-, Test- und Release-Phase genutzt werden kann. Wenn die Diagnosefunktionen immer verfügbar sind, sobald ein Problem auftaucht, können alle Entwickler jeden Tag davon profitieren. Aufgezeichnet werden alle Informationen, die für die Applikation relevant sind – darunter auch interne Daten und Zustände, die zur Laufzeit nicht nach außen gelangen. Außerdem lassen sich alle