Profiling und Coverage mit GNU und Bare Embedded Systems
Transcription
Profiling und Coverage mit GNU und Bare Embedded Systems
Profiling und Coverage mit GNU und Bare Embedded Systems “Life is too short for bad tools!” Prof. Erich Styger erich.styger@hslu.ch +41 41 349 33 01 Coverage und Profiling Coverage: Analyse der Testabdeckung von Software. Das Ziel ist eine Steigerung der Qualität. Profiling: Analyse des Laufzeitverhaltens von Software. Das Ziel ist eine Leistungsoptimierung des Systems. "Kann man dafür nicht die GNU Tools benutzen, die man für Embedded Linux kennt?" #2 GNU ist GNU ist nicht gleich GNU? - Analyse braucht Ressourcen - RAM, FLASH, File System, … - Embedded: GNU for ARM Embedded (launchpad) - GNU Tools: gcov (Coverage) und gprof (Profiling) Tools - Verwendung auch für Embedded?!? ??? Embedded Linux #3 Embedded 'Bare Metal' Coverage mit GNU gcov Prof. Erich Styger erich.styger@hslu.ch +41 41 349 33 01 Coverage - Information über - Welche Zeilen - Wie oft ausgeführt - Report Generierung - Essenziell für Testabdeckung #5 gcov: Coverage mit GNU Tools - Instrumentierung mit gcc - Generierung von .gcno (GNU Coverage Node) auf Host - Ausführung der Anwendung auf Host - Generierung von .gcda (Gnu Coverage) Daten - Report Generierung auf Host mittels gcov Host/Embedded Linux GNU GCC App gcc GNU GCOV *.gcno gcov Lib App #6 Lib Debug Interface *.gcda reports Gcov für Bare Embedded - Benötige Coverage Library (File I/O) - Constructor Inits, File I/O, gcov_exit() - Semi Hosting: Transfer der Daten auf Host Host GNU GCC App gcc GNU GCOV *.gcno gcov I/O Lib *.elf Debug Interface App #7 I/O Lib Embedded Board Debug Interface *.gcda Semihosting reports Gcov: Arcs, Edges, Branches - Instrumenetierung an 'strategischen Stellen' (Arcs) - Gcov: 'Condition coverage', NICHT 'Decision Coverage' - Lx: 64bit Zähler (RAM) k = 0; if (i==10) { i += j; j++; } else { foo(); } bar(); Instrumentation Compiler Option - Compiler Optionen -fprofile-arcs -ftest-coverage - gcc erstellt*.gcno Dateien - Kann einzelne Dateien instrumentieren #9 Instrumentation: Linker Optionen - Linker Optionen -specs=rdimon.specs: semihosting (file/console I/O) -fprofile-arcs: Use profiling/instrumentation # 10 Schreiben der Coverage .gcda Datei - Anwendung ruft _exit(0) auf - Coverage Daten werden an Files angehängt (Multiple Runs) Application # 11 _exit(0); gcov_exit(); Write files Analyse der Daten mit gcov in Eclipse - Doppel-Klick Coverage Datei - Benötigt .elf Datei (Symbol/Debug Information) gcov Eclipse Ansicht - Coverage Status Information - Zusammenfassung, Module, Funktionen - Doppel-Klick auf File/Funktion - Öffnet Quelltext Ansicht - Report Generierung Coverage Information in Quelltext - Grün - ausgeführt - Rot - nicht ausgeführt - Information, wie oft ausgeführt Zusammenfassung: Coverage - GNU Coverage (gcov) für Embedded - Instrumentierung durch gcc/Compiler - Tools auf Host: Eclipse, gcov - Herausforderungen für Bare Embedded - Library Implementierung (File I/O, Schreiben der Dateien) - Daten auf Host transferieren (z.B. mit Semihosting) - RAM Verbrauch (8 Bytes pro Zähler) - Ändert geringfügig Laufzeitverhalten! Profiling mit GNU gprof Prof. Erich Styger erich.styger@hslu.ch +41 41 349 33 01 Profiling - Abschätzung über Laufzeitverhalten - Was wurde wie oft, wie lange ausgeführt - Wo verbringt das Programm seine Laufzeit # 17 gprof für Bare Embedded - Benötige Profiling Library (File I/O) - PC Sampling, Counting, File I/O - Semi Hosting: Transfer der Daten auf Host Host App GCC GPROF gcc gprof I/O Lib *.elf Debug Interface App # 18 I/O Lib Embedded Board Debug Interface gmon.out Semihosting reports Rechenzeit der Funktion - Differenz der Zeit zwischen Anfang und Ende? - Problematisch bei RTOS/Time-slicing/Interrupts -gprof: Statistisches Sampling - Unterstützung durch RTOS/Interrupts - Erstellung eines Histogramms (min, max, step) void bar(void) { … … } bar_t0 void each10ms(void) { SamplePC(); } Histogram bar_t1 Min Addr # 19 Max Addr mcount(): Zählen der Aufrufe - Compiler: Instrumentierung mit _mcount() Aufruf -_mcount() berechnet Arc - src (caller) und dst (callee) - Neuer Eintrag in (Hash)Tabelle, Erhöhung Zähler void bar(void) { … } void foo(void) { … bar(); … } # 20 __gnu_mcount_nc: {save regs} bl _mcount_internal {restore regs} Arc Table Src Dst Nof 0x1200 0x1500 5 0x240A 0x2448 1 _exit() _mcleanup() gmon.out -_exit(): Generierung von Daten File - gmon.out: spezielle Datei für gprof - Header, Versions Information, Profile Frequenz - Daten über Funktionsaufrufe und Anzahl (Arcs) - Daten über Profile Sampling void main(void) { … _exit(0); … } void _exit(int) { … _mcleanup(); } void _mcleanup(void) { … } # 21 gmon.out Analyse von gmon.out mit gprof (Eclipse) # 22 RAM Anforderungen (Arcs und Histogramm) - Text/Code (lowPC, highPC) - Arcs - hasfraction: Grösse Call Instruktion - arcdensity: Wie viele Aufrufe - Histogram - histfraction: PC Sampling Auflösung, Grösse Funktionen froms[] 96 text 16 8192 # 23 Entries: text÷ hashfraction 8192/2*2=4096 kcount[] tos[] 32: 32: 16: 16: selfpc count link pad Entries: text* arcdensity ÷100 8192*2%*12=1956 16 Entries: textsize ÷ histfraction 8192/2=4096 10148 Profiling: Zusammenfassung - GNU Profiling (gprof) für Embedded - Instrumentierung durch gcc/Compiler - PC Sampling, Zählung Funktions-Aufrufe - Herausforderungen für Bare Embedded - Library Implementierung (File I/O, Schreiben der Dateien) - Daten auf Host transferieren (z.B. mit Semihosting) - RAM Verbrauch - Ändert geringfügig Laufzeitverhalten! # 24 Literatur/Links - https://gcc.gnu.org/onlinedocs/gcc/Gcov.html - https://sourceware.org/binutils/docs/gprof - https://docs.freebsd.org/44doc/psd/18.gprof/paper.pdf - Blog McuOnEclipse - http://mcuoneclipse.com/2014/12/26/code-coveragefor-embedded-target-with-eclipse-gcc-and-gcov/ - http://mcuoneclipse.com/2015/05/31/code-coveragewith-gcov-launchpad-tools-and-eclipse-kinetis-designstudio-v3-0-0/ Vielen Dank für die Aufmerksamkeit! # 25