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