Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Visual Studio-Debugger enthält Ausdrucksauswerter, die funktionieren, wenn Sie einen Ausdruck im Dialogfeld "QuickWatch ", " Überwachungsfenster " oder " Direktfenster " eingeben. Die Ausdrucksauswerter arbeiten auch im Fenster " Haltepunkte " und an vielen anderen Stellen im Debugger.
In den folgenden Abschnitten werden Einschränkungen der Ausdrucksauswertung für von Visual Studio unterstützte Sprachen beschrieben.
F#-Ausdrücke werden nicht unterstützt
F#-Ausdrücke werden nicht erkannt. Wenn Sie F#-Code debuggen, müssen Sie Ihre Ausdrücke in C#-Syntax übersetzen, bevor Sie die Ausdrücke in ein Debuggerfenster oder Dialogfeld eingeben. Wenn Sie Ausdrücke von F# in C# übersetzen, denken Sie daran, dass C# den == Operator verwendet, um die Gleichheit zu testen, während F# den einzelnen =verwendet.
C++-Ausdrücke
Informationen zur Verwendung von Kontextoperatoren mit Ausdrücken in C++ finden Sie unter Context Operator (C++).
Nicht unterstützte Ausdrücke in C++
Konstruktoren, Destruktoren und Umwandlungen
Sie können weder explizit noch implizit einen Konstruktor oder Destruktor für ein Objekt aufrufen. Der folgende Ausdruck ruft beispielsweise explizit einen Konstruktor auf und führt zu einer Fehlermeldung:
my_date( 2, 3, 1985 )
Sie können keine Konvertierungsfunktion aufrufen, wenn das Ziel der Konvertierung eine Klasse ist. Eine solche Umwandlung umfasst die Konstruktion eines Objekts. Wenn myFraction beispielsweise eine Instanz von CFraction ist, die den Konvertierungsfunktionsoperator FixedPoint definiert, führt der folgende Ausdruck zu einem Fehler:
(FixedPoint)myFraction
Sie können die Operatoren 'new' oder 'delete' nicht aufrufen. Der folgende Ausdruck wird beispielsweise 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 nicht im Überwachungsfenster verwenden. Um diese Einschränkung zu vermeiden, sollten Sie #define-Verwendungen nach Möglichkeit durch Enums und Funktionen ersetzen.
Verwenden von Namespacedeklarationen
Sie können using namespace Deklarationen nicht verwenden. Um auf einen Typnamen oder eine Variable außerhalb des aktuellen Namespace zuzugreifen, müssen Sie den vollqualifizierten Namen verwenden.
Anonyme Namespaces
Anonyme Namespaces werden nicht unterstützt. Wenn Sie über den folgenden Code verfügen, können Sie dem Überwachungsfenster nicht hinzufügen test :
namespace mars
{
namespace
{
int test = 0;
}
}
int main()
{
// Adding a watch on test doesn't work.
mars::test++;
return 0;
}
Verwenden systeminterner Debuggerfunktionen zum Verwalten des Zustands
Mit den systeminternen Debuggerfunktionen können Sie bestimmte C/C++-Funktionen in Ausdrücken aufrufen, ohne den Zustand der Anwendung zu ändern.
Systeminterne Debuggerfunktionen:
Ist garantiert sicher: Das Ausführen einer systeminternen Debuggerfunktion beschädigt nicht den Prozess, der gedebuggt wird.
Sind in allen Ausdrücken zulässig, auch in Szenarien, in denen Nebenwirkungen und Funktionsauswertung nicht zulässig sind.
Arbeiten Sie in Szenarien, in denen die regulären Funktionsaufrufe nicht möglich sind, z. B. beim Debuggen eines Minidumps.
Systeminterne Debuggerfunktionen können auch die Auswertung von Ausdrücken komfortabler gestalten. Beispielsweise ist es viel einfacher,
strcmp(str, "asd")in eine Haltepunktbedingung zu schreiben alsstr[0] == 'a' && str[1] == 's' && str[2] == 'd'. )
| Area | Intrinsische 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 auf Windows 8 ausgeführt wird, laufen. Für das Debuggen von Speicherabbilddateien, die von einem Windows 8-Gerät generiert werden, muss auch der Visual Studio-Computer Windows 8 ausführen. Wenn Sie jedoch ein Windows 8-Gerät remote debuggen, kann der Visual Studio-Computer Windows 7 ausführen. WindowsGetStringLen und WindowsGetStringRawBuffer werden nur von der Ausführungsumgebung (EE) auf der Quell-Ebene verwendet. |
| Sonstiges |
__log2 - Gibt die Protokollbasis 2 einer angegebenen ganzzahligen Zahl zurück, die auf die nächste untere ganze Zahl gerundet ist. __findNonNull : Durchsucht ein Array von Zeigern und gibt den Index des ersten Nicht-Null-Elements zurück. - Parameter: (1) Zeiger auf das erste Element im Array (void*), (2) Größe des Arrays (nicht signiert int). - Rückgabewerte: (1) der 0-basierte Index des ersten nicht-Null-Elements im Array, oder -1, wenn nicht gefunden. DecodeHString - Hilfsfunktion zum Formatieren des Werts eines HSTRING. Entfernt den HSTRING-Wert vom Stapel, schiebt die Bytes einer StringInfo-Struktur, damit die EE verwenden kann, um festzustellen, wo sich der String befindet. Dies wird nur intern vom EE verwendet; der Benutzer kann nicht direkt anrufen. DecodeWinRTRestrictedException – Decodiert eine winRT eingeschränkte Ausnahme, um die eingeschränkte Beschreibung abzurufen. - Parameter: (1) Zeichen einer mit Null beendeten Zeichenfolge, die die eingeschränkte Bezugszeichenfolge darstellt. - Rückgabewert: Zeichen einer mit Null beendeten Zeichenfolge, die die tatsächliche anzuzeigende Fehlermeldung enthält. DynamicCast – Implementiert dynamic_cast. - Parameter: (1) Zeiger auf das zu konvertierende Objekt. - Datenelemente: Ein CDynamicCastData-Objekt sollte der entsprechenden ExecuteIntrinsic()-Anweisung als Datenelement zugeordnet werden. Das Datenelement codiert den Typ, von dem und in den wir umwandeln, sowie ob ein natvis-Ausdruck ausgewertet wird (erforderlich für die Diagnose, um unendliche Rekursion zu unterbrechen). - Rückgabewert: (1) Ein Zeiger auf das Objekt, umwandlung in den richtigen Typ oder NULL, wenn das zu umwandelnde Objekt keine Instanz des richtigen Typs ist. DynamicMemberLookup – Hilfsfunktion zum dynamischen Abrufen des Werts eines Klassenmemberelements GetEnvBlockLength – Hilfsfunktion zum Abrufen der Länge eines Umgebungsblocks in Zeichen. Wird für $env verwendet. Stdext_HashMap_Int_OperatorBracket_idx - Operator[] für stdext::hash_map. Setzt voraus, dass die Standardhashfunktion mit dem Schlüssel "int" verwendet wird. Gibt den Wert zurück. Der systeminterne Operator[] unterstützt nur das Abrufen vorhandener Elemente aus der Hashtabelle – es unterstützt nicht das Einfügen neuer Elemente in die Tabelle, da dies zu unerwünschter Komplexität führen könnte, z. B. speicherzuordnung. Operator[] kann jedoch verwendet werden, um den einem Schlüssel zugeordneten Wert zu ändern, der bereits in der Tabelle enthalten ist. - Stapelparameter: (1) Die Adresse des stdext::hash_map-Objekts, (2) Der Schlüssel in die Tabelle (int), (3) eine HashMapPdb-Struktur, die die Feldoffsets der Mitglieder angibt, die die Funktionsimplementierung für die Suche benötigt. Dies ist erforderlich, da der direkte Zugriff auf Symbole nicht auf der Remoteseite verfügbar ist. - Rückgabewerte: (1) Wenn sich der Schlüssel in der Tabelle befindet, wird die Adresse des dem Schlüssel entsprechenden Werts zurückgegeben. Andernfalls NULL. Std_UnorderedMap_Int_OperatorBracket_idx - std::unordered_map funktioniert auf die gleiche Weise wie stdext::hash_map, außer die Hashfunktion unterscheidet sich. ConcurrencyArray_OperatorBracket_idx // Concurrency::array<>::operator[index<>] und operator(index<>) ConcurrencyArray_OperatorBracket_int // Concurrency::array<>::operator(int, int, ...) ConcurrencyArray_OperatorBracket_tidx // Concurrency::array<>::operator[tiled_index<>] und operator(tiled_index<>) ConcurrencyArrayView_OperatorBracket_idx // Concurrency::array_view<>::operator[index<>] und operator(index<>) ConcurrencyArrayView_OperatorBracket_int // Concurrency::array_view<>::operator(int, int, ...) ConcurrencyArrayView_OperatorBracket_tidx // Concurrency::array_view<>::operator[tiled_index<>] und operator(tiled_index<>) TreeTraverse_Init - Initialisiert einen neuen Baumdurchlauf. Unterstützt erweiterungsbasierte Visualisierungen, die nicht in NATVIS-Dateien verwendet werden sollen. TreeTraverse_Next Ruft Knoten aus einer ausstehenden Baumtraversierung ab. Unterstützt erweiterungsbasierte Visualisierungen, die nicht in NATVIS-Dateien verwendet werden sollen. TreeTraverse_Skip – Überspringt Knoten in einem anhängigen Baumdurchlauf. Unterstützt erweiterungsbasierte Visualisierungen, die nicht in NATVIS-Dateien verwendet werden sollen. |
C++/CLI – Nicht unterstützte Ausdrücke
Umwandlungen, die Zeiger oder benutzerdefinierte Umwandlungen umfassen, werden nicht unterstützt.
Objektvergleich und -zuordnung werden nicht unterstützt.
Überladene Operatoren und überladene Funktionen werden nicht unterstützt.
Boxen und Unboxing werden nicht unterstützt.
SizeofOperator wird nicht unterstützt.
C# – Nicht unterstützte Ausdrücke
Dynamische Objekte
Sie können Variablen in Debuggerausdrücken verwenden, die statisch als dynamisch eingegeben werden. Wenn Objekte, die IDynamicMetaObjectProvider implementieren, im Überwachungsfenster ausgewertet werden, wird ein "Dynamische Ansicht"-Knoten hinzugefügt. Der Knoten "Dynamische Ansicht" zeigt Objektmitglieder an, lässt jedoch keine Bearbeitung der Werte der Mitglieder zu.
Die folgenden Features dynamischer Objekte werden nicht unterstützt:
Die Verbundoperatoren
+=,-=,%=, und/=*=Viele Umwandlungen, einschließlich numerischer Umwandlungen und Typargumentumwandlungen
Methodenaufrufe mit mehr als zwei Argumenten
Eigenschaften-Abfrager mit mehr als zwei Argumenten
Eigenschaftensatzer mit Argumenten
Zuweisen zu einem Indexer
Boolesche Operatoren
&&und||
Anonyme Methoden
Das Erstellen 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 eingegeben werden. Wenn Objekte, die die IDynamicMetaObjectProvider Implementierung implementieren, im Überwachungsfenster ausgewertet werden, wird ein Knoten "Dynamische Ansicht" hinzugefügt. Der Knoten "Dynamische Ansicht" zeigt Objektmitglieder an, erlaubt jedoch keine Bearbeitung der Werte der Mitglieder.
Die folgenden Features dynamischer Objekte werden nicht unterstützt:
Die Verbundoperatoren
+=,-=,%=, und/=*=Viele Umwandlungen, einschließlich numerischer Umwandlungen und Typargumentumwandierungen
Methodenaufrufe mit mehr als zwei Argumenten
Eigenschafts-Getter mit mehr als zwei Argumenten
Eigenschaftensetzer mit Argumenten
Zuweisen zu einem Indexer
Boolesche Operatoren
&&und||
Lokale Konstanten
Lokale Konstanten werden nicht unterstützt.
Aliase importieren
Importaliasen werden nicht unterstützt.
Variable Deklarationen
Sie können keine expliziten neuen Variablen in Debuggerfenstern deklarieren. Sie können jedoch neue implizite Variablen im Immediate-Fenster zuweisen. Diese impliziten Variablen gelten für die Debugsitzung und sind außerhalb des Debuggers nicht zugänglich. Die Anweisung o = 5 erstellt beispielsweise implizit eine neue Variable o und weist ihm den Wert 5 zu. Solche impliziten Variablen sind vom Typ "Object ", es sei denn, der Typ kann vom Debugger abgeleitet werden.
Nicht unterstützte Schlüsselwörter
AddressOfEndErrorExitGotoOn ErrorResumeReturnSelect/CaseStopSyncLockThrowTry/Catch/FinallyWithSchlüsselwörter auf Namespace- oder Modulebene, wie
End SuboderModule.