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
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.
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.
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
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:
Erstellen Sie eine .txt-Protokolldatei, in die Sie die vollständige Signatur jeder Funktion schreiben, die Sie protokollieren möchten, zum Beispiel:
%Vor%{
und vor }
ein. Es wird ein paar Stunden dauern, bis du ein solches Programm erstellst. 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).
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) ) ...
Dies funktioniert in MS Visual C. Sie benötigen verschiedene Versionen des Makros return
für verschiedene Datentypen (oder keine).
Ausgabe:
%Vor%Tags und Links c design-patterns debugging trace