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. # 2 "Kann man dafür nicht die GNU Tools benutzen, die man für Embedded Linux kennt?"
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 Embedded 'Bare Metal' # 3
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 App GNU GCC GNU GCOV gcc *.gcno gcov reports Lib App Lib Debug Interface *.gcda # 6
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 App GNU GCC GNU GCOV gcc *.gcno gcov reports I/O Lib *.elf Debug Interface App I/O Lib Debug Interface *.gcda # 7 Embedded Board Semihosting
Gcov: Arcs, Edges, Branches - Instrumenetierung an 'strategischen Stellen' (Arcs) - Gcov: 'Condition coverage', NICHT 'Decision Coverage' - L x : 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 _exit(0); gcov_exit(); Write files # 11
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 reports I/O Lib *.elf Debug Interface App I/O Lib Debug Interface gmon.out # 18 Embedded Board Semihosting
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 bar_ t1 void each10ms(void) { SamplePC(); } Histogram Min Addr Max Addr # 19
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(); } gnu_mcount_nc: {save regs} bl _mcount_internal {restore regs} Arc Table Src Dst Nof 0x1200 0x1500 5 0x240A 0x2448 1 # 20
_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) { } gmon.out # 21
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 text froms[] 16 Entries: text hashfraction tos[] 96 32: selfpc 32: count 16: link 16: pad Entries: text* arcdensity 100 kcount[] 16 Entries: textsize histfraction 8192 8192/2*2=4096 8192*2%*12=1956 8192/2=4096 10148 # 23
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