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 CFraction
ist, durch die der Konvertierungsfunktionsoperator FixedPoint
definiert 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 3
deklariert wird, können Sie VALUE
im Fenster Überwachen nicht verwenden. Um diese Einschränkung zu vermeiden, sollten Sie #define
nach 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 alsstr[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.
Der
Sizeof
-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
oderModule
.