Forum: PC-Programmierung C-Makros zur Funktionsüberdeckung?


von Erwin M. (nobodyy)


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?

von Wilhelm M. (wimalopaan)


Lesenswert?


von Johann L. (gjlayde) Benutzerseite


Lesenswert?


von Erwin M. (nobodyy)


Lesenswert?

Wilhelm M. schrieb:
> Dazu gibt es:
>
> https://gcc.gnu.org/onlinedocs/gcc/Gcov.html

Das hilft mir nicht weiter, weil es ein Anwendungs-Programm ist und das 
scheidet bei einer freestanding implementation aus.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ob Freestanding Mode oder Hosted Mode ist doch erstmal egal.  Oder was 
ist das Problem mit Freestanding Mode?

von Erwin M. (nobodyy)


Lesenswert?

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.

von Μαtthias W. (matthias) Benutzerseite


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

von Johann L. (gjlayde) Benutzerseite


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.

von Erwin M. (nobodyy)


Lesenswert?

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.

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

-finstrument-functions

von Johann L. (gjlayde) Benutzerseite


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.

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Vielleicht hilft has hier erst mal weiter:

http://www.catb.org/esr/faqs/smart-questions.html

von Erwin M. (nobodyy)


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.

: Bearbeitet durch User
von MaWin (Gast)


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.

von Wilhelm M. (wimalopaan)


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?

von Erwin M. (nobodyy)


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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Erwin M. schrieb:
> meistens mit GCC compiliert

Da gibt's ein Makro dafür.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.