Debugging heute Die Krux mit den Käfern

Debugging ist wichtig
Debugging ist wichtig

Entwicklung, Produktion, Vertrieb – nichts läuft mehr ohne die richtige Software. Bis der erste Bug auftaucht. UltraSoc ist eine der Firmen die sich mit neuen Möglichkeiten des Debugging auseinandersetzt. Denn die Käfersuche in der heutigen Technik bringt mehr Probleme als Lösungen mit sich.

Fehler erst kurz vor der geplanten Produkteinführung aufzudecken, führt zu teuren oder peinlichen Verzögerungen und kann Umsatzverluste von mehreren Millionen Euro zur Folge haben. Weitaus dramatischer können die Konsequenzen ausfallen, wenn schwerwiegende Bugs erst nach der Markteinführung gefunden werden. Im schlimmsten Fall drohen Haftungsklagen und teure Rückrufaktionen.

Debugging ist ein entscheidender Bestandteil der erfolgreichen Entwicklung eingebetteter Systeme. Dass es nicht standardmäßig genutzt wird, liegt vor allem an den großen Schwierig­keiten mit traditionellen Debugging-Anwendungen. Mit der Verschiebung des Entwicklungsschwerpunktes hin zu heterogenen Mehrprozessorumgebungen, spitzt sich die Situation noch weiter zu. Die meisten Debugger wurden für Prozesse mit einem einzigen Rechenwerk entwickelt und lassen sich nur schwer bis überhaupt nicht auf komplexere Systeme übertragen.

Anforderungen an das Debugging

Im besten Fall zeigt ein Debugger transparent alle Änderungen im getesteten System an und kontrolliert die wichtigsten Einstellungen. Eine hohe Transparenz stellt sicher, dass die Programmierer und Systemarchitekten sehen können, wie die Werte innerhalb der Verarbeitungseinheiten des System-on-a-Chip (SoC) manipuliert und im Speicher abgelegt werden. Dieses Echtzeitverhalten wird dann mit den Anforderungen des Entwicklungsteams an ihr Produkt verglichen. Der Schreibzugriff auf das Zielsystem versorgt die Entwickler mit der Möglichkeit, Werte in Registern oder im Speicher zu modifizieren und die Auswirkungen dieser Änderungen zu sehen, ohne den Code erneut kompilieren zu müssen.

Dank der Kontrolle über das Zielsystem, kann das System mit vorherbestimmten Werten gestoppt und wieder gestartet werden. Für das Debugging ist es entscheidend, dass andere Werte nicht aktualisiert werden, bevor die Änderungen ausgeführt wurden. Auch bedingte Programmstopps (Breakpoints) müssen vorhanden sein. Sie stoppen den Prozessor bei bestimmten Bedingungen, zum Beispiel wenn Parameter ihren Bereich überschreiten oder wenn eine bestimmte Adresse erreicht wird. Dies verhindert, dass der Prozessor in einen unvorhersehbaren Zustand übergeht, in dem nützliche Daten verloren gehen.

Simulieren mit Software

In der SoC-Entwicklungsumgebung ist die Simulation zu einer wichtigen Plattform für die Software-Entwicklung geworden. Der Einsatz einer Simulation bereits in der frühen Entwicklungsphase bringt eine ganze Reihe von Vorteilen, aber auch einen grundsätzlichen Nachteil. Zu den größten Vorteilen einer Simulation zählt, dass ein vollständiges Set an Debugging-Funktionen in der Software von Anfang an verfügbar ist. Die Infrastruktur um das Prozessormodell herum hat vollen Zugriff auf dessen Zustand und die internen Signale. Zudem kann eine Simulation genutzt werden, lange bevor die aktuelle Hardware verfügbar ist. Dadurch können die Software-Entwicklungsteams sehr früh in der Projektphase damit beginnen, Aspekte der Applikationsentwicklung zu erforschen, sogar bevor die Eigenschaften und Funktionen des Produktes endgültig festgelegt sind.

Mit dem bequemen Zugang zum (simulierten) internen Zustand des Prozessors kann der Programmierer die Ausführung einer kritischen Sektion des Codes nachverfolgen. Mit Hilfe von Ein-Schritt-Funktionen kann er sich rückwärts durch eine Sequenz arbeiten und so das fehlerhafte Ergebnis bis zu seiner Quelle zurückverfolgen. Unglücklicherweise ist die Simulation um ein Vielfaches langsamer als die Zielhardware. Häufig kann also nur ein kleiner Teil des gesamten Codes auf der simulierten Hardware getestet werden.

Die Emulation und die Simulationsbeschleunigung verbessern zwar das Verhalten der virtuellen Zielhardware, aber die Einsicht beim Debugging verbessert sich dadurch nur minimal. Emulations-Plattformen auf Basis kundenspezifischer SoCs wurden deshalb so weiterentwickelt, dass sie die Übermittlung von vielen internen Logiksignalen zu einer Visualisierungs-Workstation unterstützen.