Kernelcoverage mit Testwell CTC++
Code Coverage auf dem Linux-Kernel
Mit Testwell CTC++ ist die Messung der Code Coverage auf dem laufenden Systemkernel möglich.Im Kernel ist als zentralem Teil des Betriebssystems die Prozess- und Datenorganisation festgelegt, auf der alle weiteren Softwarebestandteile aufbauen.
Für die Messung der Kernelcoverage nutzt Testwell CTC++ mit dem Host-Target Add-on die gleichen Komponenten und Techniken, die auch für die Messung der Code Coverage auf embedded Targets eingesetzt werden. Technisch wird der Kernel-Code wird dabei wie ein Target behandelt.
Die Messung der Testcoverage im Kernel ist eine Herausforderung für alle Coverage-Tools, die mit der Code-Instrumentierung arbeiten. Bei der Analyse der Coverage des Kernel-Codes können die instrumentierten Sonden keine Bibliotheksfunktionen oder Systemaufrufe verwenden. Die Instrumentierung und die Laufzeitunterstützung von Testwell CTC++ benötigt lediglich den C-Code und keinerlei weitere Systemunterstützung. Aus diesem Grund kann Testwell CTC++ problemlos im Kernel ausgeführt werden.
Proof of Concept
Als "Proof of Concept" für die Messung der Testabdeckung im Kernel haben wir den kompletten Linuxkernel instrumentiert und eine Testsuite auf ihm ausgeführt.Hierzu wurde der Kernel von Linux 2.4.0 mit 227 C-Code-Dateien (158.000 Quellcodezeilen) sowie die erforderlichen Headerdateien analysiert. Die ursprüngliche Kompilierzeit betrug etwa neun Minuten (545 KB Kernel).
Mit der Instrumentierung aller 227 Quellcodedateien in dem höchsten Instrumentierungsmodus (MCC-Coverage) betrug die Kompilierzeit ungefähr 16 Minuten (+78%). Der instrumentierte Kernel hatte sich auf 916 KB (+68%) vergrößert.
Die frei verfügbare Linux-Kernel-Testsuite von Hewlett Packard Enterprise in der Version ltp-20001012 wurde sowohl mit dem ursprünglichen nicht-instrumentierten Kernel als aus mit dem instrumentierten Kernel ausgeführt. Hierbei gab es keine merkbare Änderung der Performance.
Die Testsuite brachte keine hohe Testabdeckung der 227 C-Dateien. Booten und Login brachten bereits 21% und das Ausführen der Testsuite steigerte die Coverage (Multicondition-Stufe) um weitere 4% auf 25%. Wichtig war für uns allerdings nicht die Höhe der Testabdeckung (auf die Testwell CTC++ als reines Analysetool keinen Einfluss hat), sondern der Nachweis, dass ein kompletter Kernel mit Testwell CTC++ (inklusive zeitkritischer Teile) instrumentiert und ein Covererage-Report ausgegeben werden kann.
Das oben genannte Beispiel zeigt exemplarisch den Overhead von Testwell CTC++ bezüglich der Instrumentierung und Kompilierzeit. Sogar bei Anwendung der höchsten Coveragestufen ist der Overhead relativ gering.
Hier ist der Kernelcoverage-Report verfügbar. In den beiden Browserfenstern sind jeweils zwei Frames zu sehen. Der linke Rahmen im ersten Fenster zeigt die Coverageübersicht auf Dateiniveau. Durch Klicken auf einen Dateinamen, gibt der rechte Rahmen eine Detailansicht der Funktionen dieser Datei aus. Durch Klicken auf die Links im rechten Rahmen wird im zweiten Fenster das detaillierte Execution-Profil der betreffenden Datei oder Funktion gezeigt. Im rechten Rahmen des zweiten Fensters wird der aktuelle Quellcode angezeigt. Der obere Rahmen zeigt alle 227 Dateien.