Toolkombination verkürzt Time-to-Market

Code-Coverage: Mit der richtigen Kombination zum Ziel

30. Oktober 2025, 11:37 Uhr | Stephen Di Camillo, Frank Riemenschneider / ak
Die Kombination aus den TRACE32-Tools von Lauterbach und der LDRA tool suite von LDRA sorgt für effiziente und zeitsparende Codeabdeckungsmessungen.
© Lauterbach

Die Kombination aus den TRACE32-Tools von Lauterbach und der LDRA tool suite von LDRA ermöglicht effiziente und zeitsparende Codeabdeckungsmessungen in allen Softwareentwicklungs- und Testphasen. Auch die Sicherheitszertifizierungen beschleunigen sich dadurch. Doch wie funktioniert die Kombination?

Diesen Artikel anhören

Eine Voraussetzung für Sicherheitszertifizierungen ist die Messung der Codeabdeckung, um die Vollständigkeit der Testfälle zu bewerten und nachzuweisen, dass keine unbeabsichtigten Funktionen vorhanden sind. Durch die Kombination aus der »LDRA tool suite« und den TRACE32-Tools lassen sich Codeabdeckungsmessungen effizient und zeitsparend gestalten, weil der Umfang der erforderlichen Code-Instrumentierung und damit die Anzahl der erforderlichen Builds und Runs abnimmt. Damit können Anwender viel Zeit und Aufwand einsparen, um die Markteinführung sicherheitskritischer Produkte zu beschleunigen.

Einführung in Code Coverage

Die Codeabdeckungsmessung – englisch Code Coverage, auch strukturelle Abdeckungsanalyse genannt – wird von den Normen für funktionale Sicherheit in allen Branchen gefordert. DO-178C (Avionik), ISO 26262 (Automobil), IEC 61508 (Industrie) und IEC 62304 (medizinische Geräte) beispielsweise verlangen alle ein unterschiedliches Maß an Codeabdeckungsmessungen, je nachdem, wie kritisch die Software ist.

Das Ziel der Codeabdeckungsmessung ist die Messung des Umfangs, in dem Software getestet wurde. Die Einhaltung der Normen für funktionale Sicherheit erfordert meist anforderungsbasierte Tests (englisch: requirements-based testing, RBT). Das Ziel von RBT ist der Nachweis, dass jede Anforderung ordnungsgemäß implementiert und verifiziert wurde. Durch die Analyse der Codeabdeckung während der Durchführung von RBT lässt sich leicht feststellen, ob und wo zusätzlicher Code vorhanden ist, der zu einer unbeabsichtigten Funktionalität führen könnte, einschließlich einer Sicherheitslücke oder eines Sicherheitsrisikos.

passend zum Thema

Trace-Infrastruktur in einem SoC.
Bild 1. Trace-Infrastruktur in einem SoC.
© Lauterbach

Die für die Messung und Analyse der Codeabdeckung verwendeten Tools spielen eine Schlüsselrolle für den Zeit-, Ressourcen- und Kostenaufwand, den die Erfüllung der Codeabdeckungs-Anforderungen mit sich bringt. Die LDRA tool suite umfasst umfangreiche Funktionen zur Messung und Analyse der Codeabdeckung mithilfe geringstmöglicher Code-Instrumentierung – Funktionen, die für alle Arten von Codeabdeckungsmessung geeignet sind. Die TRACE32-Entwicklungswerkzeuge von Lauterbach bieten nicht-intrusive Codeabdeckungsmessungen und grundlegende Abdeckungsanalysefunktionen. Die LDRA tool suite in Verbindung mit Lauterbachs TRACE32-Werkzeugen zu nutzen, spart viel Zeit und Aufwand und beschleunigt damit die Markteinführung. Dieser entscheidende Aspekt wird später im Detail diskutiert.

Die gängigsten Arten der Codeabdeckungsmessung sind Statement Coverage, Branch Coverage und die Abdeckung mehrerer Bedingungen/Entscheidungen (MC/DC). Andere Formen der Coverage sind Data and Control Coupling Coverage (DCCC), Function Coverage, Call Coverage und Linear Code Sequence and Jump (LCSAJ) Coverage. Während die Codeabdeckungsmessung meist auf den Quellcode angewandt wird, verlangen einige Standards, dass die Codeabdeckung für die kritischste Software auch auf den Objektcode angewendet wird, um sicherzustellen, dass der Compiler keinen Code einfügt, der nicht direkt auf die Anweisungen des Quellcodes zurückzuführen ist. Die Anforderungen sind in den Verifizierungstabellen zusammengefasst, die zu den Normen gehören [1].

Um die Codeabdeckung zu messen, stützt sich die LDRA tool suite auf die Instrumentierung des Codes. Im Gegensatz dazu verwenden die TRACE32-Werkzeuge von Lauterbach [2] in erster Linie die gewonnenen Trace-Daten zur Messung und Analyse der Codeabdeckung. Bei Trace-basierten Codeabdeckungsmessungen wird die Code-Instrumentierung entweder komplett eliminiert oder zumindest stark reduziert. Die Analyse der Codeabdeckung in TRACE32 weist gewisse Limits auf; in einigen Fällen ist es nicht möglich, Trace-Daten während der Tests vom Target abzurufen. Durch die Kombination der Fähigkeiten der LDRA tool suite und der TRACE32-Tools benötigen Testingenieure weniger Build- und Testläufe für eine vollständige Codeabdeckungsmessung, was in realen Beispielen bis zu 50 Prozent des Gesamtaufwands spart.

Trace-basierte Codeabdeckungsmessung mit TRACE32 – Grundlagen und Vorteile

Prozessor-Trace ist die Möglichkeit, den gesamten Ausführungsablauf eines Prozessors aufzuzeichnen, wenn eine Anwendung darin läuft. Dies erfordert einen Chip, der Trace-Unterstützung implementiert hat. Die meisten SoCs (System-on-a-Chip) und Mikrocontroller, die in sicherheitsrelevanten Projekten eingesetzt werden, verfügen über solch eine Trace-Funktionalität.

Durchführung von Code-Coverage-Messungen in TRACE32.
Bild 2. Durchführung von Code-Coverage-Messungen in TRACE32.
© Lauterbach

Bild 1 zeigt einen Chip mit einem Arm-Cortex-A-Core. Es kann einen oder mehrere davon geben. An ihm ist ein spezieller Block namens ETM angebracht, der jede einzelne Verzweigung, die ausgeführt wurde, als einzelnes Bit kodiert und in einem Trace-Buffer speichert. Dies geschieht bei jeder Verzweigung, und es ist möglich, jeden Datenzugriff aufzuzeichnen, der von der CPU durchgeführt wird.

Dieser Bitstrom wird dann entweder in einem On-Chip-Trace-Puffer abgelegt, der oft recht klein ist, aber eine hohe Bandbreite hat, oder er lässt sich über eine Trace-Schnittstelle aus dem Chip herausführen. Dies kann entweder über eine parallele oder eine serielle Schnittstelle erfolgen. Der Chip kann sogar eine funktionale Schnittstelle wie USB oder Ethernet verwenden.

Diese Daten lassen sich dann in Lauterbachs TRACE32-PowerTrace-Modul speichern, das über mehrere Gigabyte Trace-Speicher verfügt. Die Datenspeicherung im TRACE32-PowerTrace-Modul empfiehlt sich auch für die Aufzeichnung von Traces für Code-Coverage-Messungen, weil der On-Chip-Trace-Puffer für größere Messungen zu klein ist.

Sobald all diese Informationen von der Trace-Schnittstelle gesammelt wurden, ist es möglich, die Codeabdeckung aus den Daten zu berechnen (Bild 2). Bei traditionellen, instrumentierten Code-Coverage-Ansätzen wird der Code mit einer speziellen Instrumentierung kompiliert. Bei der trace-basierten Codeabdeckung dagegen ist im Allgemeinen keine Instrumentierung erforderlich: Ingenieure kompilieren den Code einfach so, wie sie es bei Produktionsgeräten tun würden. Es gibt selbstredend ohne Instrumentierung keine wirkliche Zunahme der Codegröße. Dies kann ein großer Vorteil sein, besonders bei begrenzten Flash-Speichergrößen.

Beispiel für instrumentierten Code, der von der LDRA tool suite generiert wurde.
Bild 3. Beispiel für instrumentierten Code, der von der LDRA tool suite generiert wurde.
© LDRA

Darüber hinaus, und das kann noch wichtiger sein, gibt es ohne Code-Instrumentierung logischerweise auch keinen Einfluss auf das Timing der Software. Die Verwendung von Instrumentierung würde zusätzliche Speicheranweisungen erfordern, was zusätzliche Ausführungszeit bedeuten könnte. Mit der Trace-basierten Codeabdeckungsmessung verletzen die Entwickler daher keine Echtzeit-Anforderungen. Ein weiterer Vorteil besteht darin, dass man denselben Code in einem Simulator ohne Änderungen wie in echter Hardware ausführen kann. Dies ist zum Beispiel für Unit-Tests sehr nützlich.

Nur für MC/DC und die Branch-Abdeckungsmessung in Fällen wie bedingten Anweisungen, die von Lauterbachs T32cast-Tool automatisch erkannt und behandelt werden, ist ein sehr geringer Umfang an Instrumentierung erforderlich.

Trace-basierte Codeabdeckungsmessungen mit TRACE32 – Unterstützte Metriken

Objektcode Coverage, Statement Coverage und Function Coverage werden direkt und ohne Instrumentierung unterstützt [3].

Für MC/DC Coverage, Branch Coverage, Decision Coverage, Condition Coverage und Call Coverage kann eine gewisse, sehr geringe, Instrumentierung erforderlich sein. Um herauszufinden, ob eine zusätzliche Instrumentierung erforderlich ist, generiert TRACE32 eine Warnung über eine Trace-Lücke. Entwickler können dann diese Lücken exportieren und die erforderliche Code-Instrumentierung automatisch durchführen lassen.

RBT und Rückverfolgbarkeit von Anforderungen unter Verwendung der LDRA tool suite.
Bild 4. RBT und Rückverfolgbarkeit von Anforderungen unter Verwendung der LDRA tool suite.
© LDRA

Dies geschieht mit dem Code-Analyse-Tool TRACE32 T32cast, das zunächst eine High-Level-Code-Analyse durchführt, um alle Entscheidungen und Bedingungen im Code zu erfassen, und dann, falls erforderlich, die Instrumentierung vornimmt. Das Tool verfügt über eine einfache Kommandozeilenschnittstelle und lässt sich in viele gängige Build-Flows integrieren.

Im Allgemeinen wird empfohlen, die Compiler-Optimierung für optimale Ergebnisse zu deaktivieren. Der Grund dafür ist, dass der Compiler einige Verzweigungen durch bedingte Anweisungen ersetzen oder sogar Entscheidungen komprimieren kann, und TRACE32 kann die Bedingungsergebnisse dieser Verzweigungen nicht berechnen.

TRACE32 bietet einige eingebaute Funktionen zur Messung und Anzeige von Codeabdeckungsergebnissen. Bild 2 zeigt ein Beispiel, bei dem die Abdeckung einzelner Funktionen im oberen rechten Fenster angezeigt wird. Die LDRA tool suite bietet jedoch noch weitergehende Testfunktionalität und ausgefeiltere Analysemöglichkeiten.

Abdeckungsanalyse mit der LDRA tool suite – Grundlagen und Vorteile

Wie bereits erwähnt, verwendet die LDRA tool suite die Code-Instrumentierung ausschließlich zur Durchführung von Abdeckungsanalysen. Die Code-Instrumentierung von LDRA ist so konzipiert, dass die CPU-Auslastung und der Speicher-Overhead der Code-Instrumentierung so gering wie möglich sind.

Die Abdeckungsanalyse mit der LDRA tool suite beginnt mit der statischen Analyse. Die statische LDRA-Analyse erstellt ein Kontrollflussmodell und ein Datenflussmodell des zu analysierenden Codes (Bild 3). Diese Modelle sind an sich schon nützlich, weil sie die Benutzer unter anderem über die Programmstruktur, die Abhängigkeiten zwischen Entscheidungen und Verzweigungen, die Datenstruktur und die Datenabhängigkeiten informieren können. Die aus der statischen Analyse gewonnenen Daten ermöglichen eine effiziente Platzierung von Prüfpunkten im Code. Folglich führt dieser Ansatz zu einem theoretisch minimalen Overhead.

Integration von TRACE32 in die LDRA tool suite.
Bild 5. Integration von TRACE32 in die LDRA tool suite.
© Lauterbach

Darüber hinaus ist diese Implementierung sehr flexibel und funktioniert hervorragend mit allen Arten von Zielsystemen, von 8-Bit-Mikrocontrollern bis hin zu den neuesten eingebetteten 64-Bit-Multicore-Mikroprozessoren und SoCs. Meist stellen die Anwender fest, dass die Instrumentierung den ROM- und RAM-Footprint um etwa zehn Prozent vergrößert. Dieser Wert erhöht sich auf fast 20 Prozent, wenn MC/DC hinzugefügt wird. Durch die Vermeidung von Betriebssystem- und Chip-Primitiven reduziert die LDRA-Abdeckungsanalyse außerdem den Zeit- und Arbeitsaufwand für die Erfassung von Code-Abdeckungsdaten im Zielsystem.

Anforderungsbasiertes Testen (RBT) und die LDRA tool suite

Wie schon erwähnt, geht es bei der strukturellen Abdeckung nicht nur um die Abdeckung selbst, sondern auch darum, welche Anforderungen mit der Abdeckung verbunden sind - das zuvor diskutierte Konzept der RBT. Bild 4 zeigt die Verfolgung der Anforderungen bis zur Architektur bzw. zum Architekturmodell und dann bis zum Quellcode und zu den Tests. Diese Rückverfolgbarkeit stellt sicher, dass die Modellelemente das tun, was sie tun sollen, und dass die Anforderungen angemessen getestet werden. Dies ist besonders wichtig bei DO-178C-DAL-A-Anwendungen, bei denen die Rückverfolgbarkeit der Anforderungen unabhängig erfüllt werden muss. Die LDRA tool suite wird häufig zur Erfassung der Abdeckung bei der Durchführung von RBT auf einer Line Replaceable Unit (LRU) oder einem ganzen System verwendet - ein typischer Fall für ein Avionik-Projekt. Die Benutzer integrieren das Board in eine Box und können trotzdem Code-Coverage-Informationen sammeln, auch wenn kein Debugger mehr angeschlossen ist. Zusätzlich zu einer Debugger-Verbindung kann die LDRA tool suite über eine serielle Schnittstelle, CAN-Ports, Ethernet-Ports oder jede andere verfügbare Verbindungsmöglichkeit zum Target kommunizieren. Mit diesem Ansatz lassen sich unbegrenzt Daten zur Codeabdeckung sammeln. Die Daten können während des gesamten Tests auf Systemebene gesammelt werden. Nach Abschluss der Tests lassen sich die Abdeckungsdaten bei Bedarf in einer festen Größe ohne jegliche Einschränkung auslagern.

Kombination von TRACE32- und LDRA-tool-suite- Coverage-Daten

Letztlich profitieren Anwender von der Kombination der fortschrittlichen Testfunktionalität der LDRA tool suite mit der zeit- und ressourcensparenden Code-Abdeckungsmessung von TRACE32.

Zu diesem Zweck bietet TRACE32 eine erweiterte API, so dass TRACE32 vollständig automatisiert werden kann. Über die API kann LDRA TRACE32 aus der LDRA tool suite heraus starten, den Testfall ausführen und die Ergebnisse sammeln.

Für Unit-Tests können Entwickler die integrierten TRACE32-Befehlssatzsimulatoren auch ohne Hardware betreiben, was für die Pre-Silicon-Verifikation ebenfalls sehr interessant ist. Diese Simulatoren lassen sich auch mit Lauterbachs TQSK[4] qualifizieren.

Bild 5 zeigt die Integration der LDRA tool suite mit TRACE32 unter Verwendung realer Hardware oder der eingebauten Befehlssatzsimulatoren.

Aus TRACE32 importierte Codeabdeckungsdaten.
Bild 6. Aus TRACE32 importierte Codeabdeckungsdaten.
© LDRA

Die LDRA tool suite kann TRACE32-Abdeckungsdaten sowohl im XML- als auch im LLN-Format zusammenführen. Bild 6 zeigt die mit TRACE32 erhaltenen Codeabdeckungsdaten, die über die GUI in die LDRA tool suite importiert wurden. Die Ergebnisansicht zeigt, dass es Statement coverage, Branch coverage und MC/DC-Abdeckung gibt.

Die Abdeckungsdaten lassen sich auch in Berichtsform überprüfen, indem der Codeabdeckungsbericht untersucht wird. Diese Berichte, die in vielen Avionik- und Automobilprojekten verwendet werden, sind wichtige Zertifizierungsartefakte, die mit der LDRA tool suite erstellt wurden. Mit Hilfe der Berichte oder der grafischen Benutzeroberfläche lassen sich die Details der Abdeckungsmetriken durch einfaches Anklicken der gewünschten Metriken untersuchen.

Zur Erfassung weiterer Abdeckungsdaten können in der LDRA tool suite zusätzliche Testfälle erstellt und ausgeführt werden. Dazu wird in diesem Beispiel dasselbe Target verwendet, das jetzt aber über die serielle Schnittstelle angeschlossen ist. Es werden Tests durchgeführt, die zusätzlichen Funktionen abgefragt und dann die kombinierten Abdeckungsdaten betrachtet, um zu sehen, wie sich die Abdeckung verbessert hat.

Nachdem die Tests abgeschlossen sind, kann man erkennen, dass ein höherer Grad an Statement-, Branch- und MC/DC Coverage erreicht wurde (Bild 7).

Abdeckungsdaten nach zusätzlichen Tests mit der LDRA tool suite.
Bild 7. Abdeckungsdaten nach zusätzlichen Tests mit der LDRA tool suite.
© LDRA

Schlussfolgerung

Die Messung der Codeabdeckung ist für viele Sicherheitszertifizierungsstandards unerlässlich. In der Tat wird sie als Teil des Sicherheitslebenszyklus immer wichtiger. Die Herausforderungen bestehen darin, sicherzustellen, dass hierdurch die Leistung und Funktionalität nicht beeinträchtigt werden und dass die Datenerfassung in allen Betriebsumgebungen möglich ist, einschließlich Embedded-Betriebsumgebungen, in denen kein Debugger verfügbar ist.

Die Kombination aus der Fähigkeit von TRACE32, Codeabdeckungsdaten direkt aus dem Prozessor zu sammeln, und der LDRA-Methode zur Erfassung der Codeabdeckung durch Instrumentierung ermöglicht es Ingenieuren, diese Herausforderungen zu meistern.

Die LDRA tool suite integriert die Abdeckungsdaten verschiedener Tools, einschließlich der Ergebnisse von Unit-Tests und Coverage Justifications. Die resultierende Codeabdeckung wird nahtlos in Berichte eingefügt, welche die Einhaltung der Normen für funktionale Sicherheit ermöglichen.

Sowohl LDRA als auch Lauterbach bieten TÜV-Zertifizierungen sowie Tool-Qualifizierungspakete für ihre jeweiligen Code-Coverage-Lösungen an. Als Marktführer und Experten für Embedded-Systeme und -Software sind beide in der Lage, mit einer Vielzahl von Chips und Devices zu arbeiten, einschließlich solcher mit neuen Architekturen und Betriebssystemen.

Die Autoren

Stephen Di Camillo ist Technical Marketing and Business Development Manager bei der LDRA Ltd.

Frank Riemenschneider ist Senior Marketing Expert bei der Lauterbach GmbH.

Literatur

[1] Code-Coverage-Analyse und anforderungsbasiertes Testen in Embedded-Systemen: https://ldra.com/capabilities/code-coverage-analysis/

[2] Trace-Tools TRACE32 von Lauterbach: https://www.lauterbach.com/products/trace-extensions

[3] TRACE32-basierte Code-Abdeckungsmessung: https://www.lauterbach.com/use-cases/code-coverage

[4] Vertrauenswürdige Tools für funktionale Sicherheit: https://www.lauterbach.com/use-cases/tool-qualification


Lesen Sie mehr zum Thema


Jetzt kostenfreie Newsletter bestellen!

Weitere Artikel zu Lauterbach GmbH

Weitere Artikel zu LDRA Inc.

Weitere Artikel zu Embedded

Weitere Artikel zu Echtzeit-/Embedded Software

Weitere Artikel zu Embedded-Systeme

Weitere Artikel zu Software/Entwicklung