C-Makros zur Funktionsüberdeckung?

OP #5051409
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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.
Persönliche Seite #5052548
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren