Ausdrücke im Visual Studio-Debugger

Der Visual Studio-Debugger beinhaltet eine Ausdrucksauswertung, die aktiv wird, wenn Sie einen Ausdruck in das Dialogfeld Schnellüberwachung , in das Fenster Überwachen oder in das Fenster Direkt eingeben. Die Ausdruckauswertung ist auch im Fenster Haltepunkte sowie an vielen anderen Stellen im Debugger aktiv.

In den folgenden Abschnitten werden die Einschränkungen der Ausdrucksauswertung für Sprachen beschrieben, die von Visual Studio unterstützt werden.

F#-Ausdrücke werden nicht unterstützt.

F#-Ausdrücke werden nicht erkannt. Wenn Sie F#-Code debuggen, müssen Sie die Ausdrücke vor dem Eingeben in ein Debuggerfenster oder ein Dialogfeld in C#-Syntax übersetzen. Wenn Sie Ausdrücke aus F# in C# übersetzen, beachten Sie, dass C# den == -Operator für Gleichheitstests verwendet, wohingegen F# ein einfaches Gleichheitszeichen ( =) verwendet.

C++-Ausdrücke

Informationen zum Verwenden von Kontextoperatoren mit Ausdrücken in C++ finden Sie unter Context Operator (C++).

Nicht unterstützte Ausdrücke in C++

Konstruktoren, Destruktoren und Konvertierungen

Einen Konstruktor oder Destruktor für ein Objekt können Sie weder explizit noch implizit aufrufen. Mit folgendem Ausdruck wird ein Konstruktor beispielsweise explizit aufgerufen, was eine Fehlermeldung zur Folge hat:

my_date( 2, 3, 1985 )

Sie können keine Konvertierungsfunktion aufrufen, wenn es sich beim Ziel der Konvertierung um eine Klasse handelt. Eine solche Konvertierung impliziert die Erstellung eines Objekts. Wenn myFraction beispielsweise eine Instanz von CFractionist, durch die der Konvertierungsfunktionsoperator FixedPointdefiniert wird, verursacht der folgende Ausdruck einen Fehler:

(FixedPoint)myFraction

Sie können den new- oder delete-Operator nicht aufrufen. Beispielsweise wird der folgende Ausdruck nicht unterstützt:

new Date(2,3,1985)

Präprozessormakros

Präprozessormakros werden im Debugger nicht unterstützt. Wenn beispielsweise eine Konstante VALUE als #define VALUE 3deklariert wird, können Sie VALUE im Fenster Überwachen nicht verwenden. Um diese Einschränkung zu vermeiden, sollten Sie #definenach Möglichkeit durch Enumerationen und Funktionen ersetzen.

"using namespace"-Deklarationen

Sie können keine using namespace-Deklarationen verwenden. Um auf einen Typnamen oder eine Variable außerhalb des aktuellen Namespace zugreifen zu können, müssen Sie den vollqualifizierten Namen verwenden.

Anonyme Namespaces

Anonyme Namespaces werden nicht unterstützt. Bei folgendem Code können Sie test im Fenster „Überwachen“ nicht hinzufügen:

namespace mars
{
    namespace
    {
        int test = 0;
    }
}
int main()
{
    // Adding a watch on test doesn't work.
    mars::test++;
    return 0;
}

Verwenden der systeminternen Funktionen des Debuggers zur Beibehaltung des Zustands

Die systeminternen Debugger-Funktionen geben Ihnen eine Möglichkeit, zum Aufruf bestimmter C/C++-Funktionen in Ausdrücken ohne den Zustand der Anwendung zu ändern.

Systeminterne Debugger-Funktionen:

  • Diese sind absolut sicher: durch das Ausführen einer systeminternen Debugger-Funktion wird der Prozess, der debuggt wird, nicht beschädigt.

  • Sie sind in allen Ausdrücken zulässig, sogar in Szenarien, in denen Nebeneffekte und Funktionsauswertung nicht gestattet sind.

  • Sie arbeiten in Szenarien, in denen reguläre Funktionsaufrufe nicht möglich sind, z. B. das Debuggen eines Minidumps.

    Mit systeminternen Debugger-Funktionen kann die Auswertung von Ausdrücken bequemer werden. Beispielsweise ist strncmp(str, "asd") viel einfacher in einer Haltepunktbedingung zu schreiben als str[0] == 'a' && str[1] == 's' && str[2] == 'd'. )

Bereich Systeminterne Funktionen
Zeichenfolgenlänge strlen, wcslen, strnlen, wcsnlen
Zeichenfolgenvergleich strcmp, wcscmp, stricmp, wcsicmp, _stricmp, _strcmpi, _wcsicmp, _wcscmpi, strncmp, wcsncmp, strnicmp, wcsnicmp, _strnicmp, _wcsnicmp
Zeichenfolgensuche strchr, wcschr, memchr, wmemchr, strstr, wcsstr
Win32 CoDecodeProxy, DecodePointer, GetLastError, TlsGetValue
Windows 8 RoInspectCapturedStackBackTrace, WindowsCompareStringOrdinal, WindowsGetStringLen, WindowsGetStringRawBuffer

Für diese Funktionen muss der Prozess, der debuggt wird, auf Windows. 8 ausgeführt werden. Das Debuggen von Dumpdateien, die von einem Windows 8-Gerät generiert werden, erfordert auch, dass auf dem Visual Studio-Computer Windows 8 ausgeführt wird. Wenn Sie für ein Windows 8-Gerät Remotedebuggen durchführen, kann auf dem Visual Studio-Computer Windows 7 ausgeführt werden.
WindowsGetStringLen und WindowsGetStringRawBuffer werden nur von dem Ausführungsmodul (EE) auf der Quellebene verwendet.
Verschiedenes __log2: Gibt die Protokollbasis 2 einer angegebenen ganzen Zahl auf die nächste kleinere ganze Zahl gerundet zurück.

__findNonNull: Durchsucht ein Array von Zeigern und gibt den Index des ersten Elements zurück, wenn der Wert nicht Null ist.
- Parameter: (1) Zeiger auf das erste Element in Array (void*), (2) Größe des Arrays (nicht signiertes Int).
- Rückgabewerte: (1) 0-basiertes Index des ersten nicht null-Elements in Array oder -1, wenn nicht gefunden.

DecodeHString - Hilfsfunktion zum Formatieren des Werts eines HSTRING. Zeigt den HSTRING-Wert von einem Stapel an und überträgt mithilfe der Push-Funktion die Bytes einer StringInfo-Struktur, die das Ausführungsmodul verwenden kann, um zu erkennen, wo sich die Zeichenfolge befindet. Dies wird nur intern von dem Ausführungsmodul verwendet. Es ist für den Benutzer für den direkten Aufruf nicht verfügbar.

DecodeWinRTRestrictedException: Diese Ausnahme decodiert eine eingeschränkte WinRT-Ausnahme, um die eingeschränkte Beschreibung zu erhalten.
– Parameter: (1) Die Zeichen einer Zeichenfolge, die auf null endet und die eingeschränkte Verweiszeichenfolge darstellt.
– Rückgabewert: Die Zeichen einer Zeichenfolge, die auf null endet und die tatsächliche Fehlermeldung enthält, die angezeigt werden soll.

DynamicCast – Implementiert dynamic_cast.
– Parameter: (1) Der Zeiger ist auf das Objekt gerichtet, das umgewandelt werden soll.
– Datenelemente: Ein CDynamicCastData-Objekt sollte der entsprechenden ExecuteIntrinsic()-Anweisung als Datenelement zugeordnet werden. Das Datenelement codiert den Typ, von und in den wir umwandeln, sowie ob wir einen natvis-Ausdruck auswerten (erforderlich, damit die Diagnose die unendliche Rekursion unterbricht).
– Rückgabewert: (1) Ein Zeiger, der auf das Objekt gerichtet ist, das in den richtigen Typ umgewandelt wird, oder in NULL, wenn das Objekt, das umgewandelt wird, keine Instanz des richtigen Typs ist.

DynamicMemberLookup – Eine Hilfsfunktion zum dynamischen Erhalten des Werts eines Klassenmembers

GetEnvBlockLength – Eine Hilfsfunktion zum Erhalten der Länge eines Umgebungsblocks ausgedrückt in Zeichen. Wird für $env. verwendet

Stdext_HashMap_Int_OperatorBracket_idx – Operator[] for stdext::hash_map. Setzt die Standardhashfunktion mit einem „int“ Schlüssel voraus. Gibt den Wert zurück. Der systeminterne Operator[] unterstützt nur das Abrufen vorhandener Elemente aus der Hashtabelle. Das Einfügen neuer Elemente in die Tabelle wird nicht unterstützt, da dies unerwünschte Komplexität mit sich bringen kann, z. B. die Speicherzuweisung. Der Operator[] kann jedoch verwendet werden, um den Wert zu ändern, der einem Schlüssel zugeordnet ist, der bereits in der Tabelle vorhanden ist.
– Die Stapelparameter: (1) Die Adresse des stdext::hash_map-Objekts, (2) Der Schlüssel in der Tabelle (int), (3) eine HashMapPdb-Struktur, die die Feld-Offsets der Member angibt, die die Funktionsimplementierung für das Lookup benötigt. Dies ist erforderlich, da der direkte Zugriff auf Symbole auf der Remote-Seite nicht verfügbar ist.
– Die Rückgabewerte: (1) Wenn sich der Schlüssel in der Tabelle befindet und die Adresse des Wertes diesem Schlüssel entspricht. Andernfalls wird NULL verwendet.

Std_UnorderedMap_Int_OperatorBracket_idx – std::unordered_map funktioniert auf die gleiche Weise wie stdext::hash_map, außer dass die Hashfunktion anders ist.

ConcurrencyArray_OperatorBracket_idx // Concurrency::array<>::operator[index<>] and operator(index<>)

ConcurrencyArray_OperatorBracket_int // Concurrency::array<>::operator(int, int, ...)

ConcurrencyArray_OperatorBracket_tidx // Concurrency::array<>::operator[tiled_index<>] and operator(tiled_index<>)

ConcurrencyArrayView_OperatorBracket_idx // Concurrency::array_view<>::operator[index<>] and operator(index<>)

ConcurrencyArrayView_OperatorBracket_int // Concurrency::array_view<>::operator(int, int, ...)

ConcurrencyArrayView_OperatorBracket_tidx // Concurrency::array_view<>::operator[tiled_index<>] and operator(tiled_index<>)

TreeTraverse_Init // – Initialisiert eine neue Traversierung der Struktur.
Unterstützt erweiterungsbasierte Schnellansichten, die nicht in .natvis-Dateien verwendet werden sollen.

TreeTraverse_Next – Ruft Knoten aus einem ausstehenden Strukturdurchlauf ab.
Unterstützt erweiterungsbasierte Schnellansichten, die nicht in .natvis-Dateien verwendet werden sollen.

TreeTraverse_Skip – Überspringt die Knoten in einer ausstehenden Traversierung der Struktur.
Unterstützt erweiterungsbasierte Schnellansichten, die nicht in .natvis-Dateien verwendet werden sollen.

C++/CLI – Nicht unterstützte Ausdrücke

  • Typumwandlungen mit Zeigern oder benutzerdefinierten Typumwandlungen werden nicht unterstützt.

  • Vergleiche und Zuweisungen von Objekten werden nicht unterstützt.

  • Überladene Operatoren und überladene Funktionen werden nicht unterstützt.

  • Boxing und Unboxing werden nicht unterstützt.

  • DerSizeof-Operator wird nicht unterstützt.

C# – Nicht unterstützte Ausdrücke

Dynamische Objekte

Sie können Variablen in Debuggerausdrücken verwenden, die statisch als dynamisch typisiert sind. Wenn Objekte, die IDynamicMetaObjectProvider implementieren, im Überwachungsfenster ausgewertet werden, wird ein dynamischer Ansichtsknoten hinzugefügt. Der dynamische Ansichtsknoten zeigt Member an, ermöglicht aber keine Bearbeitung der Memberwerte.

Die folgenden Funktionen dynamischer Objekte werden nicht unterstützt:

  • Die zusammengesetzten Operatoren +=, -=, %=, /=und *=

  • Viele Umwandlungen, einschließlich numerischer Umwandlungen und Typargumentumwandlungen

  • Methodenaufrufe mit mehr als zwei Argumenten

  • Eigenschaftengetter mit mehr als zwei Argumenten

  • Eigenschaftensetter mit Argumenten

  • Zuweisen zu einem Indexer

  • Boolesche Operatoren && und ||

Anonyme Methoden

Die Erstellung neuer anonymer Methoden wird nicht unterstützt.

Visual Basic – Nicht unterstützte Ausdrücke

Dynamische Objekte

Sie können Variablen in Debuggerausdrücken verwenden, die statisch als dynamisch typisiert sind. Wenn Objekte, die die IDynamicMetaObjectProvider implementieren, im Überwachungsfenster ausgewertet werden, wird ein dynamischer Ansichtsknoten hinzugefügt. Der dynamische Ansichtsknoten zeigt Member an, ermöglicht aber keine Bearbeitung der Memberwerte.

Die folgenden Funktionen dynamischer Objekte werden nicht unterstützt:

  • Die zusammengesetzten Operatoren +=, -=, %=, /=und *=

  • Viele Umwandlungen, einschließlich numerischer Umwandlungen und Typargumentumwandlungen

  • Methodenaufrufe mit mehr als zwei Argumenten

  • Eigenschaftengetter mit mehr als zwei Argumenten

  • Eigenschaftensetter mit Argumenten

  • Zuweisen zu einem Indexer

  • Boolesche Operatoren && und ||

Lokale Konstanten

Lokale Konstanten werden nicht unterstützt.

Importaliase

Importaliase werden nicht unterstützt.

Variablendeklarationen

Neue Variablen können in Debuggerfenstern nicht explizit deklariert werden. Allerdings sind Zuweisungen neuer impliziter Variablen im Fenster Direkt möglich. Diese impliziten Variablen sind auf die Debugsitzung beschränkt und können von außerhalb des Debuggers nicht aufgerufen werden. Die Anweisung o = 5 beispielsweise erstellt implizit eine neue o -Variable und weist dieser den Wert 5 zu. Solche impliziten Variablen sind vom Typ Object , sofern der Typ nicht durch den Debugger abgeleitet werden kann.

Nicht unterstützte Schlüsselwörter

  • AddressOf

  • End

  • Error

  • Exit

  • Goto

  • On Error

  • Resume

  • Return

  • Select/Case

  • Stop

  • SyncLock

  • Throw

  • Try/Catch/Finally

  • With

  • Schlüsselwörter der Namespace- oder Modulebene, wie End Sub oder Module.