Ablaufverfolgung von Funktionsaufrufen in C

8

Ich entwickle einige Module für ein in C geschriebenes Automatisierungssystem und muss viel mit Hardware arbeiten. Und ich sehe keine einfache Möglichkeit (wie traditionell), Dinge zu debuggen anstatt Trace-Logs. Ich suche nach einer guten Übung, um Funktionsaufrufe zu protokollieren. Zumindest die Reihenfolge der Aufrufe und Rückgabewerte.

Die Art, wie es in der Anwendung ausgeführt wird, ist ziemlich einfach und verschmutzt den Code tatsächlich mit irrelevanten Konstruktionen wie

%Vor%

Ich habe beschlossen, ein Makro zu verwenden, das all die schmutzige Arbeit erledigt. Jetzt sieht es so aus.

%Vor%

Ich sehe die Probleme mit diesem Code

  1. Ich überschreibe die return-Anweisung, und es ist erforderlich, return(ret) die ganze Zeit anstatt return ret zu schreiben. Es ist leicht, dieses Problem zu vergessen.

  2. Ich definiere Stringvariable in meinem Makro. Mir ist bewusst, dass __func__ Makro in C99 existiert, aber mein Compiler unterstützt dieses Makro oder andere relevante Makros leider nicht.

  3. Wie protokolliert man die Werte von Funktionsargumenten?

Ich bin mir ziemlich sicher, dass es kein neues Problem ist und ich nicht der erste bin, der damit konfrontiert wurde. Ich bin mir auch über eine AOP-Sache bewusst, aber die Code-Instrumentierung ist keine akzeptable Lösung für mein System und ich habe keine Möglichkeit gefunden, dies mit meinem Compiler zu tun.

Ich bin also auf der Suche nach einer guten Idee, wie man Tracing auf die eleganteste Art und Weise implementiert.

Meine Umgebung: Legacy-Code, C, Watcom 10.x, Echtzeitbetriebssystem

    
evrdrkgrn0 11.03.2015, 12:18
quelle

4 Antworten

5

Die super-seriöse, professionelle Vorgehensweise besteht darin, ein separates Debug / Test-Projekt zu erstellen, das vollständig vom Produktionscode getrennt ist. Es geht so:

  • Stellen Sie sicher, dass Sie eine Sicherungskopie für den Produktionscode haben.
  • Erstellen Sie eine Kopie des Produktionscodes auf der Festplatte. Dies wird Ihr Testprojekt werden.
  • Erstellen Sie eine .txt-Protokolldatei, in die Sie die vollständige Signatur jeder Funktion schreiben, die Sie protokollieren möchten, zum Beispiel:

    %Vor%
  • Erstellen Sie ein kleines PC-Programm / -Skript, das die obige .txt-Datei als Eingabe verwendet und dann den Quellcode nach übereinstimmenden Zeilen mit Funktionsdefinitionen durchsucht. Das PC-Programm erzeugt dann eine neue .c-Datei, die auf dem ursprünglichen Code basiert, und fügt den Debug-Logging-Code innerhalb der gewünschten Funktionen nach { und vor } ein. Es wird ein paar Stunden dauern, bis du ein solches Programm erstellst.
  • Verknüpfen Sie Ihr Testprojekt mit dem modifizierten Quellcode, der von Ihrem Skript erstellt wurde.

Die obige Methode ist, wie ich es selbst auf unternehmenskritischer Software mache, wo Sie Anforderungen von Sicherheitsstandards (MISRA, Codeabdeckung usw.) haben, die sagen, dass kein Code erlaubt ist, der im Endprodukt nicht ausgeführt wird.

>

Diese Methode stellt die Integrität des Produktionscodes sicher und garantiert, dass keine versehentlichen Fehler durch den Test / Debug-Code zum Programm hinzugefügt werden. Es lässt auch das Durcheinander von Kompilierschaltern usw. aus dem Produktionscode heraus. Und Sie werden in Ihrem Projekt keinen alten Debug-Code mehr haben, den Sie vergessen haben zu löschen (sonst vergesse ich immer irgendeinen Code-Schnipsel irgendwo in meinen Programmen).

    
Lundin 11.03.2015 13:03
quelle
1
%Vor%     
Gyapti Jain 11.03.2015 12:44
quelle
0

Sie könnten Ihren Compiler anpassen, um damit umzugehen. Sie können MELT verwenden (um Ihren gcc Compiler anzupassen), wenn Sie mit GCC .

Vielleicht passen Sie openwatcom an (oder bezahlen Sie einen OpenWatcom -Experten, um das zu tun) ) ...

    
Basile Starynkevitch 11.03.2015 13:18
quelle
0

Dies funktioniert in MS Visual C. Sie benötigen verschiedene Versionen des Makros return für verschiedene Datentypen (oder keine).

%Vor%

Ausgabe:

%Vor%     
Weather Vane 11.03.2015 13:04
quelle

Tags und Links