_RPTn funktioniert gut, wenn auch nicht ganz so praktisch. Hier ist ein Code , der die MFC TRACE-Anweisung als eine Funktion neu erstellt, die eine variable Anzahl von Argumenten erlaubt . Fügt außerdem TraceEx-Makro hinzu, das die Quelldatei und die Zeilennummer voranstellt, sodass Sie auf den Speicherort der Anweisung zurückklicken können.
Update: Der ursprüngliche Code auf CodeGuru kompiliert für mich im Release-Modus nicht, also habe ich die Art geändert, wie TRACE-Anweisungen für den Release-Modus entfernt werden. Hier ist meine vollständige Quelle, die ich in Trace.h eingetragen habe. Danke an Thomas Rizos für das Original :
%Vor%Aus den msdn-Dokumenten Makros für die Berichterstellung :
Sie können die in CRTDBG.H definierten Makros _RPTn und _RPTFn verwenden, um die Verwendung von printf-Anweisungen für das Debugging zu ersetzen. Diese Makros verschwinden automatisch in Ihrem Release-Build, wenn _DEBUG nicht definiert ist. Daher müssen sie nicht in #ifdefs eingeschlossen werden.
Trace-Makros , die Nachrichten mit Quellcode-Link , run-time-Callstack Informationen und Funktionsprototyp bereitstellen Informationen mit Parameterwerten:
Erweiterte Ablaufverfolgung : Ablaufverfolgung von Makros für Win32
Ich habe festgestellt, dass die Verwendung des Makros _RPT()
auch mit einer C-Quelldatei in Visual Studio 2005 funktioniert. Dieser Artikel Debugging mit Visual Studio 2005/2008: Protokollierung und Ablaufverfolgung bietet einen Überblick über TRACE-, _RPT- und andere Protokollierungstyp-Makros.
Ich erstelle eine Zeile für eine Protokolldatei namens ASSRTLOG, die Protokolle enthält, und wenn ich das Protokoll in die Datei schreibe, mache ich auch die folgende Quellcodezeile:
%Vor%Diese Zeile setzt das gleiche Protokoll, das in die Protokolldatei eingeht, in das Ausgabefenster der IDE von Visual Studio 2005.
Vielleicht interessieren Sie sich für die Mechanismen, die hinter dem Ansatz stehen, den wir für die Protokollierung verwenden. Wir haben eine Funktion PifLogAbort()
, die eine Reihe von Argumenten akzeptiert, die dann verwendet werden, um ein Protokoll zu erzeugen. Zu diesen Argumenten gehört der Name der Datei, in der das Protokoll zusammen mit der Zeilennummer generiert wird. Das Makro sieht folgendermaßen aus:
und der Funktionsprototyp für PifLogAbort()
sehen so aus:
und um das Makro zu verwenden, fügen wir eine Zeile wie folgt ein:
%Vor%Dieses Makro bewirkt, dass wenn der Rückgabecode kleiner als 0 ist (die Assertion schlägt fehl), ein Protokoll mit dem bereitgestellten Text erstellt wird. Das Protokoll enthält die Bedingung, die das Protokoll zusammen mit dem Dateinamen und der Zeilennummer generiert hat.
Die Funktion PifLogAbort()
erzeugt Logs mit einer bestimmten Länge und behandelt die Ausgabedatei als Ringpuffer. Die Protokolle haben auch einen Zeit- und Datumsstempel.
In den Fällen, in denen wir den beschreibenden Text zur Laufzeit dynamisch generieren möchten, um den tatsächlichen Fehlercodewert anzugeben, verwenden wir die Funktion sprintf () mit einem Puffer wie in der folgenden Codefolge:
%Vor%Wenn wir wollen, dass die Protokolle nicht generiert werden, müssen wir nur zu der einzelnen Header-Datei gehen, in der das Makro definiert ist, und es als nichts definieren, dann erneut kompilieren. Wir haben jedoch festgestellt, dass diese Protokolle bei der Untersuchung von Feldproblemen sehr nützlich sein können und insbesondere beim Integrationstest nützlich sind.
Windows-Ereignisse sind ein potentieller Ersatz für TRACE
-Makros, abhängig in Ihrem speziellen Szenario. Der Code wird in Debug- und Release-Konfigurationen kompiliert. Die Ereignisverfolgung kann dann dynamisch aktiviert und deaktiviert, in Echtzeit angezeigt oder auf dem Computer eines Kunden zur späteren Diagnose ausgegeben werden. Die Ablaufverfolgungen können auch mit Ablaufverfolgungsinformationen korreliert werden, die von anderen Teilen des Betriebssystems erfasst werden.
Wenn Sie Informationen nur dann ablegen müssen, wenn der Code bestimmte Prüfpunkte erreicht, zusammen mit variablem Inhalt, Stack-Traces oder Anrufernamen, Visual Studio's Tracepoints sind eine nicht-intrusive Möglichkeit, dies zu tun.