Frage

In MFC C ++ (Visual Studio 6) Ich bin zur Verwendung des TRACE-Makro für das Debuggen verwendet. Gibt es ein Äquivalent Aussage für Normal win32?

War es hilfreich?

Lösung

_RPTn funktioniert gut, wenn auch nicht ganz so bequem. Hier einige Code , die die MFC TRACE-Anweisung als eine Funktion nachbildet so dass variable Anzahl von Argumenten. Auch fügt TraceEx Makro, die Quelldatei und die Zeilennummer prepends, so dass Sie an die Stelle der Anweisung klicken zurück kann.

Update: Der ursprüngliche Code auf MS-Office wäre für mich in Release-Modus nicht kompilieren, damit ich die Art und Weise verändert, dass TRACE-Anweisungen für Release-Modus entfernt werden. Hier ist meine volle Quelle, die ich in Trace.h setzen. Dank Thomas Rizos für das Original :

// TRACE macro for win32
#ifndef __TRACE_H__850CE873
#define __TRACE_H__850CE873

#include <crtdbg.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>

#ifdef _DEBUG
#define TRACEMAXSTRING  1024

char szBuffer[TRACEMAXSTRING];
inline void TRACE(const char* format,...)
{
    va_list args;
    va_start(args,format);
    int nBuf;
    nBuf = _vsnprintf(szBuffer,
                   TRACEMAXSTRING,
                   format,
                   args);
    va_end(args);

    _RPT0(_CRT_WARN,szBuffer);
}
#define TRACEF _snprintf(szBuffer,TRACEMAXSTRING,"%s(%d): ", \
                &strrchr(__FILE__,'\\')[1],__LINE__); \
                _RPT0(_CRT_WARN,szBuffer); \
                TRACE
#else
// Remove for release mode
#define TRACE  ((void)0)
#define TRACEF ((void)0)
#endif

#endif // __TRACE_H__850CE873

Andere Tipps

Aus der MSDN-Dokumentation, Macros for Reporting :

  

Sie können die _RPTn verwenden und _RPTFn Makros in Crtdbg.h definiert, die Verwendung von printf-Anweisungen für die Fehlersuche zu ersetzen. Diese Makros automatisch in Ihrem Release-Build verschwinden, wenn _DEBUG nicht definiert ist, so gibt es keine Notwendigkeit, sie in #ifdefs einzuschließen.

Es ist auch Output. Aber das wird nicht entfernt werden, wenn Release kompiliert wird.

ich so etwas wie dies nur benutzen (aus dem Gedächtnis, nicht getestet ...)

#define TRACE(msg) {\
    std::ostringstream ss; \
    ss << msg << "\n"; \
    OutputDebugString(msg.str()); \
}

Und dann kann ich schreibe Dinge wie: -

TRACE("MyClass::MyFunction returned " << value << " with data=" << some.data);

Sie können in einigen #ifdefs wickeln, dass es zu entfernen, in Release leicht genug aufbaut.

Trace-Makros , die Nachrichten mit Quellcode Link , bietet Laufzeitaufrufliste Informationen und Funktionsprototyp Informationen mit Parameterwerte:

Erweiterte Trace : Trace-Makros für Win32

Ich fand, dass das _RPT() Makro auch mit einer C-Quelldatei in Visual Studio 2005. Diesen Artikel

Windows-Ereignisse ein potentieller Ersatz für TRACE sind Makros auf Ihrem speziellen Szenario abhängig. Der Code wird in beiden Debug und Release-Konfigurationen zusammengestellt. Ereignisverfolgung kann dann dynamisch in Echtzeit aktiviert und deaktiviert, angezeigt werden oder für eine spätere Diagnose auf einem Client-Maschine geworfen. Die Spuren können mit Trace-Informationen aus anderen Teilen des OS als auch gesammelt in Beziehung gesetzt werden.

Wenn Sie nur Informationen benötigen abzuladen, wenn Code bestimmte Checkpoints erreicht, zusammen mit variablen Inhalten, stapeln Spuren oder Anrufernamen, Visual Studio Trace eine non-intrusive Option, dies zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top