C-Makros zur Funktionsüberdeckung?

OP #5051409
Zur Prüfung der Funktionsüberdeckung von einem Program braucht man ja 
nur am Funktionsanfang einen Zähler inkrementieren und beim Terminieren 
vom Programm nur die Zähler mit den Funktionsnamen ausgedruckt.
Das müsste sich weitgehend automatisieren lassen, denn über _FUCTION_ 
bekommt man ja den Funktionsnamen. Aber ich konnte noch nichts 
(Präprozessor-Makro o. ä.) finden das die Gesamtzahl der Funktionen 
eines Programms berechnet und auch nichts das jeder Funktion einen Index 
(für ein Datenfeld mit den Aufruf-Zählern, eines für die Funktionsnamen) 
zuweist.
Gibt es das (noch) nicht?
Persönliche Seite #5051763
Man kann gcov auch auf einem uC ans laufen bekommen. Ging ein paar 
Informationen dazu im Netz. Aber evtl. reicht auch schon 
-finstrument-functions Die Hooks muss man halt implementieren.

https://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/
https://github.com/reeteshranjan/libgcov-embedded
https://mcuoneclipse.com/2014/12/26/code-coverage-for-embedded-target-with-eclipse-gcc-and-gcov/

Matthias
Persönliche Seite #5052438
Erwin M. schrieb:
> Johann L. schrieb:
>> Ob Freestanding Mode oder Hosted Mode ist doch erstmal egal.
>
> Nein, auf einem kleinen Mikrocontroller hat man kein Betriebssystem, auf
> dem Gcov laufen könnte.

Das hat aber nicht mit Freestanding C oder Hosted C zu tun.

Cross-Entwicklung also.  Sag das doch gleich.

AUF dem µC läuft ja auch kein gcov, sondern instumentierter Code 
generiert Daten FÜR gcov.  gcov läuft auf deinem Host.

Instrumentierung setzt eine gewisse Mindest-Umgebung voraus aber kein 
OS.  problem kann sein, dass die zu erzeugenden Daten nicht ins RAM 
passen oder der größere Code nicht mehr in den µC.

Da solchen keine Beschränkungen genannt wurden also kein Problem.

Um die Daten aus dem µC zu bekommen brauchst du entweder eine echte 
Schnittstelle / Virtualisierung von xprintf oder ein System das das von 
Hause aus unterstützt wie ein Simulator.

Es gibt auch Hersteller dir minimal-invasives Profiling anbieten, frag 
einfach mal deinen Toolchain-Support.
OP #5052522
Johann L. schrieb:
>
> AUF dem µC läuft ja auch kein gcov, sondern instumentierter Code
> generiert Daten FÜR gcov.  gcov läuft auf deinem Host.

Es soll ohne Host sein; für ein bischen inkrementieren und ein paar 
Werte ausgeben einen Host zu verwenden ist doch mit Kanonen auf Spatzen 
zu schießen. Da reichen ein Paar Code-Zeilen.
Persönliche Seite #5052548
Erwin M. schrieb:
> Es soll ohne Host sein; [...] Da reichen ein Paar Code-Zeilen.

Ungewöhnlich. Insbesondere für eine Beitrag in "PC-Programmierung".

Üblicherweise wird ja nur während der Entwicklung instrumentiert, z.B. 
für Profiling oder zur Zertifizierung.

Im Feld will man wegen des Overheads i.d.R. keinen instrumentierten Code 
mehr haben.

Erwin M. schrieb:
> Gibt es das (noch) nicht?

Nein, dein Anwendungsfall ist ziemlich speziell.  Auf Präprozessor-Ebene 
kann's da auch nix geben weil der nur Textersetz macht (Translation 
Phase 1-4).  Funktionen sind ein Konzept von Phase 7 (Compilation) bzw. 
Phase 8 (Linkage).

Von dem was du suchst wird nichts im C-Standard erwähnt.
OP #5052739
MaWin schrieb:
> -finstrument-functions

Ja, sowas in der Art, danke für den Tipp.
Aber das hilft kaum weiter, weil das keine Indizierung von Funktionen 
macht und sie auch nicht zählt.
Das muss man also manuell machen.

Ich brauche ja nur am Funktionsanfang sowas wie:

if (0 == funktionszaehler[i_funktionsnummer++])
  funktionsname[i_funktionsnumer]="__FUNCTION__";

und daneben beispielsweise vom Singal-Handler ein Ausdrucken der 
Zählerwerte mit den Funktionsnamen daneben.
Gast #5052763
Erwin M. schrieb:
> Aber das hilft kaum weiter, weil das keine Indizierung von Funktionen
> macht und sie auch nicht zählt.
> Das muss man also manuell machen.

Ja dann nimm halt einen Profiler.
Meine Güte.
Du willst einen lecker Schinken, aber kein Schwein töten.

Erwin M. schrieb:
> Ich brauche ja nur am Funktionsanfang sowas wie:

Dann implementiere das. Lösungen wurden genannt.
#5052765
Erwin M. schrieb:
> MaWin schrieb:
>> -finstrument-functions
>
> Ja, sowas in der Art, danke für den Tipp.
> Aber das hilft kaum weiter, weil das keine Indizierung von Funktionen
> macht und sie auch nicht zählt.
> Das muss man also manuell machen.
>
> Ich brauche ja nur am Funktionsanfang sowas wie:
>
> if (0 == funktionszaehler[i_funktionsnummer++])
>   funktionsname[i_funktionsnumer]="__FUNCTION__";
>
> und daneben beispielsweise vom Singal-Handler ein Ausdrucken der
> Zählerwerte mit den Funktionsnamen daneben.

Gehts eigentlich um C? Oder dürfen es auch C++-Pattern sein?
OP #5052773
Wilhelm M. schrieb:
> Erwin M. schrieb:
> brauche ja nur am Funktionsanfang sowas wie:
>>
>> if (0 == funktionszaehler[i_funktionsnummer++])
>>   funktionsname[i_funktionsnumer]="__FUNCTION__";
>>
>> und daneben beispielsweise vom Singal-Handler ein Ausdrucken der
>> Zählerwerte mit den Funktionsnamen daneben.
>
> Gehts eigentlich um C? Oder dürfen es auch C++-Pattern sein?

Ja, C, meistens mit GCC compiliert, so das auch die GCC-Erweiterungen 
verwendet werden können.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.