Partager via


Expressions dans le débogueur Visual Studio

Le débogueur Visual Studio inclut des évaluateurs d’expression qui fonctionnent lorsque vous entrez une expression dans la boîte de dialogue Inspection rapide, la fenêtre Espions ou la fenêtre Exécution immédiate. Les évaluateurs d’expression sont également au travail dans la fenêtre "Points d’arrêt" et dans de nombreux autres emplacements dans le débogueur.

Les sections suivantes décrivent les limitations de l’évaluation des expressions pour les langages pris en charge par Visual Studio.

Les expressions F# ne sont pas prises en charge

Les expressions F# ne sont pas reconnues. Si vous déboguez du code F#, vous devez traduire vos expressions en syntaxe C# avant d’entrer les expressions dans une fenêtre de débogueur ou une boîte de dialogue. Lorsque vous traduisez des expressions de F# en C#, n’oubliez pas que C# utilise l’opérateur pour tester l’égalité == , tandis que F# utilise le seul =.

C++ Expressions

Pour plus d’informations sur l’utilisation d’opérateurs de contexte avec des expressions en C++, consultez Opérateur de contexte (C++).

Expressions non prises en charge en C++

Constructeurs, destructeurs et conversions

Vous ne pouvez pas appeler un constructeur ou un destructeur pour un objet, explicitement ou implicitement. Par exemple, l’expression suivante appelle explicitement un constructeur et génère un message d’erreur :

my_date( 2, 3, 1985 )

Vous ne pouvez pas appeler une fonction de conversion si la destination de la conversion est une classe. Une telle conversion implique la construction d’un objet. Par exemple, si myFraction est une instance de CFraction, qui définit l'opérateur de fonction de conversion FixedPoint, l'expression suivante génère une erreur :

(FixedPoint)myFraction

Vous ne pouvez pas utiliser l'opérateur new ni l'opérateur delete. Par exemple, l’expression suivante n’est pas prise en charge :

new Date(2,3,1985)

Macros de préprocesseur

Les macros de préprocesseur ne sont pas prises en charge dans le débogueur. Par exemple, si une constante VALUE est déclarée comme suit : #define VALUE 3, vous ne pouvez pas utiliser VALUE dans la fenêtre Espion . Pour éviter cette limitation, vous devez remplacer #define' s par des énumérations et des fonctions dans la mesure du possible.

utilisation de déclarations d’espace de noms

Vous ne pouvez pas utiliser les déclarations using namespace. Pour accéder à un nom de type ou une variable en dehors de l’espace de noms actuel, vous devez utiliser le nom complet.

Espaces de noms anonymes

Les espaces de noms anonymes ne sont pas pris en charge. Si vous avez le code suivant, vous ne pouvez pas ajouter test à la fenêtre de surveillance :

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

Utilisation des fonctions intrinsèques du débogueur pour maintenir l’état

Les fonctions intrinsèques du débogueur vous permettent d’appeler certaines fonctions C/C++ dans les expressions sans modifier l’état de l’application.

Fonctions intrinsèques du débogueur :

  • Sont garantis comme sécurisés : l’exécution d’une fonction intrinsèque du débogueur n’endommage pas le processus en cours de débogage.

  • Sont autorisés dans toutes les expressions, même dans les scénarios où les effets secondaires et l’évaluation des fonctions ne sont pas autorisés.

  • Travaillez dans des scénarios où les appels de fonction standard ne sont pas possibles, comme le débogage d’un minidump.

    Les fonctions intrinsèques du débogueur peuvent également rendre l’évaluation des expressions plus pratique. Par exemple, strcmp(str, "asd") est beaucoup plus facile à utiliser dans une condition de point d'arrêt que str[0] == 'a' && str[1] == 's' && str[2] == 'd'. )

Area Fonctions intrinsèques
Longueur de chaîne strlen, wcslen, strnlen, wcsnlen
Comparaison de chaînes strcmp, wcscmp, stricmp, wcsicmp, _stricmp, _strcmpi, _wcsicmp, _wcscmpi, strncmp, wcsncmp, strnicmp, wcsnicmp, _strnicmp, _wcsnicmp
Recherche de chaînes strchr, wcschr, memchr, wmemchr, strstr, wcsstr
Win32 CoDecodeProxy, DecodePointer, GetLastError, TlsGetValue
Windows 8 RoInspectCapturedStackBackTrace, WindowsCompareStringOrdinal, WindowsGetStringLen, WindowsGetStringRawBuffer

Ces fonctions nécessitent que le processus en cours de débogage s’exécute sur Windows 8. Le débogage des fichiers de vidage générés à partir d’un appareil Windows 8 nécessite également que l’ordinateur Visual Studio exécute Windows 8. Toutefois, si vous déboguez un appareil Windows 8 à distance, l’ordinateur Visual Studio peut exécuter Windows 7.
WindowsGetStringLen et WindowsGetStringRawBuffer sont utilisés uniquement par le moteur d’exécution (EE) au niveau source.
Divers __log2 : retourne le logarithme base 2 d’un entier spécifié, arrondi à l'entier inférieur le plus proche.

__findNonNull : recherche un tableau de pointeurs, retournant l’index du premier élément non null.
- Paramètres : (1) Pointeur vers le premier élément du tableau (void*), (2) Taille du tableau (int non signé).
- Valeurs renvoyées : (1) index basé sur 0 du premier élément non null dans le tableau ou -1 s’il n’est pas trouvé.

DecodeHString - Fonction Helper pour mettre en forme la valeur d’un HSTRING. Retire la valeur HSTRING de la pile, pousse les octets d'une structure StringInfo que l’EE peut utiliser pour déterminer l'emplacement de la chaîne. Cela est utilisé uniquement en interne par l’EE ; il n’est pas disponible pour l’utilisateur d’appeler directement.

DecodeWinRTRestrictedException : décode une exception restreinte WinRT pour obtenir la description restreinte.
- Paramètres : (1) caractères d’une chaîne terminée par null représentant la chaîne de référence restreinte.
- Valeur de retour : caractères d’une chaîne terminée par null contenant le message d’erreur réel à afficher.

DynamicCast : implémente dynamic_cast.
- Paramètres : (1) Pointeur vers l'objet à caster.
- Éléments de données : un objet CDynamicCastData doit être associé en tant qu’élément de données à l’instruction ExecuteIntrinsic() correspondante. L'élément de données encode le type à partir duquel nous effectuons un cast et celui vers lequel nous le faisons, ainsi que si nous évaluons ou non une expression natvis (nécessaire pour que les diagnostics interrompent la récursivité infinie).
- Valeur de retour : (1) Un pointeur vers l'objet, converti au type correct, ou NULL si l'objet n'est pas du type correct.

DynamicMemberLookup - Fonction Helper pour obtenir dynamiquement la valeur d’un membre de classe

GetEnvBlockLength - Fonction Helper pour obtenir la longueur d’un bloc d’environnement, en caractères. Utilisé pour $env.

Stdext_HashMap_Int_OperatorBracket_idx - Opérateur[] pour stdext ::hash_map. Suppose la fonction de hachage par défaut avec une clé « int ». Retourne la valeur. L’opérateur intrinsèque[] prend uniquement en charge la récupération d’éléments existants à partir de la table de hachage. Il ne prend pas en charge l’insertion de nouveaux éléments dans la table, car cela peut impliquer une complexité indésirable, telle que l’allocation de mémoire. Toutefois, l’opérateur[] peut être utilisé pour modifier la valeur associée à une clé déjà dans la table.
- Paramètres de pile : (1) L'adresse de l'objet stdext::hash_map, (2) la clé dans la table (int), (3) la structure HashMapPdb qui spécifie les décalages de champ des membres dont l'implémentation de la fonction a besoin pour effectuer la recherche. Cela est nécessaire, car l’accès direct aux symboles n’est pas disponible côté distant.
- Valeurs renvoyées : (1) Si la clé se trouve dans la table, l'adresse de la valeur qui correspond à la clé. Sinon, NULL.

Std_UnorderedMap_Int_OperatorBracket_idx - std ::unordered_map fonctionne de la même façon que stdext ::hash_map, sauf que la fonction de hachage est différente.

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

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

ConcurrencyArray_OperatorBracket_tidx // Concurrency ::array<> ::operator[tiled_index<>] et opérateur(tiled_index<>)

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

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

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

TreeTraverse_Init - Initialise une nouvelle traversée d’arbre.
Prend en charge les visualiseurs basés sur l’extension, non destinés à être utilisés dans les fichiers .natvis .

TreeTraverse_Next : récupère les nœuds d’une traversée d’arborescence en attente.
Prend en charge les visualiseurs basés sur l’extension, non destinés à être utilisés dans les fichiers .natvis .

TreeTraverse_Skip : ignore les nœuds d’une traversée d’arborescence en attente.
Prend en charge les visualiseurs basés sur l’extension, non destinés à être utilisés dans les fichiers .natvis .

C++/CLI - Expressions non prises en charge

  • Les conversions qui impliquent des pointeurs ou des conversions définies par l'utilisateur ne sont pas prises en charge.

  • La comparaison et l’affectation d’objets ne sont pas prises en charge.

  • Les opérateurs surchargés et les fonctions surchargées ne sont pas pris en charge.

  • Boxing et unboxing ne sont pas pris en charge.

  • Sizeof l’opérateur n’est pas pris en charge.

C# - Expressions non supportées

Objets dynamiques

Vous pouvez utiliser des variables dans les expressions du débogueur qui sont typées statiquement comme dynamiques. Lorsque les objets qui implémentent IDynamicMetaObjectProvider sont évalués dans la fenêtre Espionnage, un nœud Vue dynamique est ajouté. Le nœud Affichage dynamique affiche les membres de l’objet, mais n’autorise pas la modification des valeurs des membres.

Les fonctionnalités suivantes des objets dynamiques ne sont pas prises en charge :

  • Opérateurs composés +=, -=, %=, /= et *=

  • De nombreuses conversions de type, y compris les conversions numériques et les conversions d’arguments de type

  • Appels de méthode avec plus de deux arguments

  • Accesseurs de propriété avec plus de deux arguments

  • Définisseurs de propriétés avec des arguments

  • Affectation à un indexeur

  • Opérateurs && booléens et ||

Méthodes anonymes

La création de nouvelles méthodes anonymes n’est pas prise en charge.

Visual Basic - Expressions non prises en charge

Objets dynamiques

Vous pouvez utiliser des variables dans les expressions du débogueur qui sont typées statiquement comme dynamiques. Quand les objets qui implémentent le IDynamicMetaObjectProvider sont évalués dans la fenêtre de surveillance, un nœud de vue dynamique est ajouté. Le nœud Affichage dynamique affiche les membres de l’objet, mais n’autorise pas la modification des valeurs des membres.

Les fonctionnalités suivantes des objets dynamiques ne sont pas prises en charge :

  • Opérateurs composés +=, -=, %=, /= et *=

  • De nombreuses conversions, y compris les conversions numériques et les conversions d’arguments de type

  • Appels de méthode avec plus de deux arguments

  • Getters de propriété avec plus de deux arguments

  • Méthodes mutatrices de propriétés avec des arguments

  • Affectation à un indexeur

  • Opérateurs && booléens et ||

Constantes locales

Les constantes locales ne sont pas prises en charge.

Importer des alias

Les alias d’importation ne sont pas pris en charge.

Déclarations de variables

Vous ne pouvez pas déclarer de nouvelles variables explicites dans les fenêtres du débogueur. Toutefois, vous pouvez affecter de nouvelles variables implicites dans la fenêtre Exécution . Ces variables implicites sont étendues à la session de débogage et ne sont pas accessibles en dehors du débogueur. Par exemple, l’instruction o = 5 crée implicitement une variable o et lui attribue la valeur 5. Ces variables implicites sont de type Object , sauf si le type peut être déduit par le débogueur.

Mots clés non pris en charge

  • AddressOf

  • End

  • Error

  • Exit

  • Goto

  • On Error

  • Resume

  • Return

  • Select/Case

  • Stop

  • SyncLock

  • Throw

  • Try/Catch/Finally

  • With

  • Mots clés au niveau de l’espace de noms ou du module, tels que End Sub ou Module.