Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de changer d’annuaire.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer d’annuaire.
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 questr[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.
Sizeofl’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
AddressOfEndErrorExitGotoOn ErrorResumeReturnSelect/CaseStopSyncLockThrowTry/Catch/FinallyWithMots clés au niveau de l’espace de noms ou du module, tels que
End SubouModule.