Gewusst wie benutzerdefinierte Zeichenfolgen für erweiterte WPP-Formatspezifikationen erstellen?
Sie erstellen benutzerdefinierte Spezifikationszeichenfolgen für erweiterte WPP-Formate mithilfe des makros DEFINE_CPLX_TYPE. Weitere Informationen zur Verwendung dieses Makros finden Sie unter Was ist die Syntax der Definition komplexer Typen?.
Dieses Thema enthält Beispiele, die Ihnen zeigen, wie Sie die folgenden Schritte ausführen:
Jedes dieser Beispiele zeigt die Verwendung einer benutzerdefinierten WPP-Konfigurationsdatei für die Definition des DEFINE_CPLX_TYPE Makros. In diesen Beispielen heißt die Konfigurationsdatei LocalWpp.ini. Weitere Informationen zur Verwendung benutzerdefinierter WPP-Konfigurationsdateien finden Sie unter Wie definieren Sie benutzerdefinierte Datentypen?.
Ablaufverfolgung von Zeichenfolgen fester Länge über benutzerdefinierte WPP-Spezifikationszeichenfolgen im erweiterten Format
In diesem Beispiel wird gezeigt, wie IPv6-Netzwerkadressen (Internet Protocol Version 6) mithilfe einer benutzerdefinierten Spezifikationszeichenfolge für erweiterte WPP-Formate nachverfolgt werden. IPv6-Netzwerkadressen, wie durch die in6_addr-Struktur definiert, haben eine Länge von 16 Byte fester Länge.
In diesem Beispiel wird ein komplexer Datentyp (IPV6ADDR) definiert, der dann als %! IPV6ADDR! Formatspezifikationszeichenfolge im Quellcode.
Um den IPV6ADDR komplexen Datentyp zu erstellen, fügen Sie der LocalWpp.ini-Konfigurationsdatei die folgenden Anweisungen hinzu:
DEFINE_CPLX_TYPE(IPV6ADDR, WPP_LOGIPV6, in6_addr *, ItemIPV6Addr, "s", _IPV6_, 0, 1);
Diese Anweisung verwendet das makro DEFINE_CPLX_TYPE, um den komplexen Typ (IPV6ADDR) zusammen mit seinen Attributen zu definieren, z. B. argumenttyp (in6_addr *) und größe (16).
Die -Anweisung gibt auch den Namen eines Hilfsmakros (WPP_LOGIPV6) an, das vom WPP-Präprozessor verwendet wird, wenn er einen IPV6ADDR komplexen Typ im Quellcode Ihres Ablaufverfolgungsanbieters analysiert.
WPP_FLAGS(-DWPP_LOGIPV6(x) WPP_LOGPAIR( (16), (x)));
Diese Anweisung definiert das Hilfsmakro, das zum Formatieren des Längen-/Adresspaars des IPV6-Arguments verwendet wird, wenn es an die TraceMessage-Funktion übergeben wird.
Öffnen Sie in Visual Studio die Eigenschaftenseite für Ihr Projekt. Geben Sie unter WPP-Ablaufverfolgung, Dateioptionen, LocalWpp.ini als zusätzliche Konfigurationsdatei an. Weitere Informationen finden Sie unter WPP-Präprozessor .
Der folgende Beispielquellcode zeigt, wie Ihr Ablaufverfolgungsanbieter IPv6-Netzwerkadressen mithilfe von %! nachverfolgen kann. IPV6ADDR! Formatspezifikationszeichenfolge:
struct in6_addr IPAddressV6 = {0};
DoTraceMessage(Noise, "IN6_ADDR = %!IPV6ADDR!", &IPAddressV6);
Hinweis Sie können einen komplexen Typ (MACADDR) zum Nachverfolgen von Mac-Adressen (Media Access Control, Medienzugriffssteuerung) mit fester Länge erstellen. Dieser komplexe Typ kann mithilfe der Prozedur angegeben werden, die für den IPV6ADDDR komplexen Typs verwendet wurde.
Ablaufverfolgung von Zeichenfolgen mit variabler Länge über benutzerdefinierte WPP-Spezifikationszeichenfolgen im erweiterten Format
In diesem Beispiel wird gezeigt, wie Sie Puffer von Daten mit variabler Länge mithilfe einer benutzerdefinierten Spezifikationszeichenfolge für erweiterte WPP-Formate nachverfolgen.
In diesem Beispiel wird ein komplexer Datentyp (HEXDUMP) definiert, der dann als %! HEXDUMP! Formatspezifikationszeichenfolge im Quellcode.
Um den komplexen HEXDUMP-Datentyp zu erstellen, fügen Sie der LocalWpp.ini-Konfigurationsdatei die folgenden Anweisungen hinzu:
DEFINE_CPLX_TYPE(HEXDUMP, WPP_LOGHEXDUMP, const xstr_t&, ItemHEXDump,"s", _HEX_, 0, 2);
Diese Anweisung verwendet das makro DEFINE_CPLX_TYPE, um den komplexen Typ (HEXDUMP) zusammen mit seinen Attributen zu definieren, z. B. seinen Argumenttyp (const xstr_t&) und die Anzahl der Parameter, die an TraceMessage (2) übergeben werden. Da dieser komplexe Typ für Daten mit variabler Länge verwendet werden soll, wird das Size-Element des Makros auf 0 (null) festgelegt.
Die -Anweisung gibt auch den Namen eines Hilfsmakros (WPP_LOGHEXDUMP) an, das vom WPP-Präprozessor verwendet wird, wenn er einen komplexen HEXDUMP-Typ im Quellcode Ihres Ablaufverfolgungsanbieters analysiert.
struct xstr_t { CHAR * _buf; short _len; xstr_t(__in_ecount(len) char *buf, short len):_buf(buf),_len(len) {} };
Diese Anweisung definiert eine Struktur, die verwendet wird, um die Länge und Adresse eines Puffers mit variabler Länge zu speichern. Diese Struktur wird im LOG_LENSTR-Makro initialisiert und ist lokal für jeden Aufruf von DoTraceMessage , in dem der komplexe HEXDUMP-Typ innerhalb des FormatString-Parameters verwendet wird.
WPP_FLAGS(-DLOG_LENSTR(len,str)=xstr_t(str,len));
Diese Anweisung definiert das Makro, das zum Initialisieren einer xstr_t-Struktur für den Puffer mit variabler Länge verwendet wird. Sie müssen dieses Makro verwenden, um den Puffer mit variabler Länge im VariableList-Parameter von DoTraceMessage zu übergeben.
WPP_FLAGS(-DWPP_LOGHEXDUMP(x) WPP_LOGPAIR(2,&(x)._len) WPP_LOGPAIR((x)._len, (x)._buf));
Diese Anweisung definiert das Hilfsmakro, das zum Formatieren der Längen-/Adresspaare des Pufferarguments variabler Länge verwendet wird, wenn es an die TraceMessage-Funktion übergeben wird.
Argumente mit variabler Länge erfordern zwei Längen-/Adresspaare. Daher definiert das makro WPP_LOGHEXDUMP zwei Aufrufe von WPP_LOGPAIR wie folgt:
- Der erste Aufruf von WPP_LOGPAIR übergibt die Größe des Puffers mit variabler Länge.
- Der zweite Aufruf von WPP_LOGPAIR übergibt die Adresse des Puffers selbst.
Hinweis Dieses Makro erfordert, dass eine xstr_t-Struktur für den Puffer mit variabler Länge durch einen Aufruf von LOG_LENSTR initialisiert wurde. Daher müssen Sie den Puffer mit variabler Länge über das makro LOG_LENSTR an DoTraceMessage übergeben.
Öffnen Sie in Visual Studio die Eigenschaftenseite für Ihr Projekt. Geben Sie unter WPP-Ablaufverfolgung, Dateioptionen, LocalWpp.ini als zusätzliche Konfigurationsdatei an. Weitere Informationen finden Sie unter WPP-Präprozessor .
Der folgende Beispielquellcode zeigt, wie Ihr Ablaufverfolgungsanbieter einen Datenpuffer mithilfe von %! HEXDUMP! Formatspezifikationszeichenfolge:
CHAR HexDump[1024] = {0, 1, 2, 3, 4, 5, 6, 7} ;
DoTraceMessage(Noise, "HEXDUMP: %!HEXDUMP! ", LOG_LENSTR(sizeof(HexDump),(PCHAR)HexDump));
Hinweis Sie können einen komplexen Typ (HEXBYTES) für die Ablaufverfolgung von Puffern mit variabler Länge erstellen. Dieser komplexe Typ kann mithilfe der Prozedur angegeben werden, die für den komplexen HEXDUMP-Typ verwendet wurde.