Spécificateurs de format pour C++ dans le débogueur Visual Studio
Vous pouvez modifier le format dans lequel une valeur est affichée dans les fenêtres Espion, Automatique et Variables locales à l’aide de spécificateurs de format.
Vous pouvez également utiliser des spécificateurs de format dans la fenêtre Exécution, la fenêtre Commande, dans points de trace et même les fenêtres sources. Si vous effectuez une suspension sur une expression dans ces fenêtres, le résultat apparaît dans un DataTip. L’affichage du DataTip reflète le spécificateur de format.
Notes
Lorsque le débogueur natif Visual Studio utilise un nouveau moteur de débogage, de nouveaux spécificateurs de format ont été ajoutés et d’anciens ont été supprimés. L’ancien débogueur est toujours utilisé quand vous effectuez un débogage d’interopérabilité (natif et managé à la fois) avec C++/CLI.
Définir les spécificateurs de format
Nous allons utiliser l’exemple de code suivant :
int main() {
int my_var1 = 0x0065;
int my_var2 = 0x0066;
int my_var3 = 0x0067;
}
Ajoutez la variable my_var1
dans la fenêtre Espion pendant le débogage, Déboguer>Fenêtres>Espion>Espion 1. Ensuite, cliquez avec le bouton droit sur la variable et sélectionnez Affichage hexadécimal. La fenêtre Espion indique à présent la valeur 0x0065. Pour voir cette valeur exprimée sous la forme d’un caractère plutôt que d’un entier, commencez par cliquer avec le bouton droit et désélectionnez Affichage hexadécimal. Ajoutez ensuite le spécificateur de format de caractères , c dans la colonne Nom après le nom de la variable. La colonne Valeur affiche désormais 101 'e'.
Vous pouvez afficher et sélectionner dans une liste de spécificateurs de format disponibles en ajoutant une virgule (,) à la valeur dans la fenêtre Espion.
Spécificateurs de format
Les tableaux suivants décrivent les spécificateurs de format que vous pouvez utiliser dans Visual Studio. Les spécificateurs en gras sont uniquement pris en charge pour le nouveau débogueur, et non pour le débogage d’interopérabilité avec C++/CLI.
Spécificateur | Format | Valeur d’espion d’origine | Valeur affichée |
---|---|---|---|
d | entier décimal | 0x00000066 | 102 |
o | entier octal non signé | 0x00000066 | 000000000146 |
x h |
entier hexadécimal | 102 | 0xcccccccc |
X H |
entier hexadécimal | 102 | 0xcccccccc |
xb hb |
Entier hexadécimal (sans 0x au début) | 102 | cccccccc |
Xb Hb |
Entier hexadécimal (sans 0x au début) | 102 | CCCCCCCC |
b | Entier binaire non signé | 25 | 0b00000000000000000000000000011001 |
bb | entier binaire non signé (sans 0b au début) | 25 | 00000000000000000000000000011001 |
e | Notation scientifique | 25000000 | 2,500000e+07 |
g | Forme courte de la notation scientifique ou virgule flottante | 25000000 | 2,5e+07 |
c | caractère unique | 0x0065 | 101 ’e’ |
s | const char* string (avec guillemets) | <emplacement> "hello world" | « Hello World » |
sb | const char* chaîne (sans guillemets) | <emplacement> "hello world" | hello world |
s8 | Chaîne UTF-8 | <emplacement> "Ceci est une tasse de café UTF-8 ☕" | "Ceci est une tasse de café UTF-8 ☕" |
s8b | chaîne UTF-8 (sans guillemets) | <emplacement> "hello world" | hello world |
su | chaîne Unicode (encodage UTF-16) (avec guillemets) | <emplacement> L"hello world" | L"hello world" u"hello world" |
sub | chaîne Unicode (encodage UTF-16) (sans guillemets) | <emplacement> L"hello world" | hello world |
bstr | chaîne binaire BSTR (avec guillemets) | <emplacement> L"hello world" | L"hello world" |
env | Bloc d’environnement (chaîne finissant par une double valeur null) | <emplacement> L"=::=::\\" | L"=::=::\\\0=C:=C:\\windows\\system32\0ALLUSERSPROFILE=... |
s32 | chaîne UTF-32 (avec guillemets) | <emplacement> U"hello world" | u"hello world" |
s32b | chaîne UTF-32 (sans guillemets) | <emplacement> U"hello world" | hello world |
en | enum | Saturday(6) | Samedi |
hv | Type de pointeur : indique que la valeur de pointeur inspectée est le résultat de l’allocation de tas d’un tableau, par exemple, new int[3] . |
<emplacement>{<premier membre>} | <emplacement>{<premier membre>, <deuxième membre>, ...} |
na | Supprime l’adresse mémoire d’un pointeur vers un objet. | <location>, {membre=valeur...} | {membre=valeur…} |
nd | Affiche uniquement les informations de classe de base, en ignorant les classes dérivées | (Shape*) square inclut les informations de classe de base et de classe dérivée |
Affiche uniquement les informations de classe de base |
heure(s) | HRESULT ou code d’erreur Win32. Ce spécificateur n’est plus nécessaire pour les HRESULT, car le débogueur les décode automatiquement. | S_OK | S_OK |
wc | Indicateur de classe de fenêtre | 0x0010 | WC_DEFAULTCHAR |
wm | Numéros de messages Windows | 16 | WM_CLOSE |
nr | Supprimer l'élément « Affichage brut » | ||
nvo | Afficher l’élément « Affichage brut » pour les valeurs numériques uniquement | ||
! | format brut, ignorant toutes les personnalisations d’affichage de type de données | <représentation personnalisée> | 4 |
handle | Affiche des informations sur le handle win32 | 0x000000000000009c | Affiche des informations utiles sur le handle, telles que l’ID de thread, etc. |
Notes
Quand le spécificateur de format hv est présent, le débogueur tente de déterminer la longueur de la mémoire tampon et d’afficher ce nombre d’éléments. Comme il n’est pas toujours possible pour le débogueur de rechercher la taille exacte de la mémoire tampon d’un tableau, vous devez utiliser un spécificateur de taille (pBuffer,[bufferSize])
chaque fois que cela est possible. Le spécificateur de format hv est utile quand la taille de la mémoire tampon n’est pas immédiatement disponible.
Spécificateurs de taille pour les pointeurs en tant que tableaux
Si vous avez un pointeur vers un objet que vous voulez afficher sous forme de tableau, vous pouvez utiliser un entier ou une expression pour spécifier le nombre d’éléments du tableau.
Spécificateur | Format | Valeur d’espion d’origine | Valeur affichée |
---|---|---|---|
n | Entier décimal ou hexadécimal | pBuffer,[32] pBuffer,[0x20] |
Affiche pBuffer sous forme d’un tableau de 32 éléments. |
[exp] | Expression C++ valide qui correspond à un entier. | pBuffer,[bufferSize] | Affiche pBuffer sous forme d’un tableau d’éléments bufferSize . |
expand(n) | Expression C++ valide qui correspond à un entier | pBuffer, expand(2) | Affiche le troisième élément de pBuffer |
Spécificateurs de format pour le débogage d’interopérabilité avec C++/CLI
Spécificateur | Format | Valeur d’espion d’origine | Valeur affichée |
---|---|---|---|
o | entier octal non signé | 0xF065 | 0170145 |
x X |
entier hexadécimal | 61541 | 0x0000f065 |
c | caractère unique | <location> | 101 ’e’ |
s | const char* (avec guillemets) | <location> | « Hello World » |
su | const wchar_t* const char16_t* (avec guillemets) |
<location> | L"hello world" |
sub | const wchar_t* const char16_t* |
<location> | hello world |
s8 | const char* (avec guillemets) | <location> | « Hello World » |
heure(s) | HRESULT ou code d’erreur Win32. Ce spécificateur n’est plus nécessaire pour les HRESULT, car le débogueur les décode automatiquement. |
S_OK | S_OK |
wc | Indicateur de classe de fenêtre | 0x00000040, | WC_DEFAULTCHAR |
wm | Numéros de messages Windows | 0x0010 | WM_CLOSE |
! | format brut, ignorant toutes les personnalisations d’affichage de type de données | <représentation personnalisée> | 4 |
Les spécificateurs d, e, f, g, h, i, l, m, ma, mb, md, mq, mu, mw et u pour le code natif et C++/CLI nécessitaient le débogueur hérité, qui n’est pas pris en charge dans Visual Studio 2022 ni versions ultérieures.
Les spécificateurs en gras sont pris en charge uniquement pour le débogage de code natif et C++/CLI. Ces spécificateurs nécessitent le débogueur hérité, spécifié à l’aide du mode de compatibilité managé.
Spécificateur | Format | Valeur d’espion d’origine | Valeur affichée |
---|---|---|---|
d i |
entier décimal signé | 0xF000F065 | -268373915 |
u | entier décimal non signé | 0x0065 | 101 |
o | entier octal non signé | 0xF065 | 0170145 |
x X |
entier hexadécimal | 61541 | 0x0000f065 |
l h |
préfixe long ou court pour : d, i, u, o, x, X | 00406042 | 0x0c22 |
f | virgule flottante signée | (3./2.), f | 1.500000 |
e | notation scientifique signée | (3.0/2.0) | 1.500000e+000 |
g | virgule flottante signée ou notation scientifique signée, selon celui qui est le plus court |
(3.0/2.0) | 1.5 |
c | caractère unique | <location> | 101 ’e’ |
s | const char* (avec guillemets) | <location> | « Hello World » |
su | const wchar_t* const char16_t* (avec guillemets) |
<location> | L"hello world" |
sub | const wchar_t* const char16_t* |
<location> | hello world |
s8 | const char* (avec guillemets) | <location> | « Hello World » |
heure(s) | HRESULT ou code d’erreur Win32. Ce spécificateur n’est plus nécessaire pour les HRESULT, car le débogueur les décode automatiquement. |
S_OK | S_OK |
wc | Indicateur de classe de fenêtre | 0x00000040, | WC_DEFAULTCHAR |
wm | Numéros de messages Windows | 0x0010 | WM_CLOSE |
! | format brut, ignorant toutes les personnalisations d’affichage de type de données | <représentation personnalisée> | 4 |
Spécificateurs de format pour les emplacements de mémoire dans le débogage d’interopérabilité avec C++/CLI
Le tableau suivant contient les symboles de mise en forme utilisés pour les emplacements de mémoire. Vous pouvez utiliser un spécificateur d’emplacement de mémoire avec n’importe quelle valeur ou expression correspondant à un emplacement.
Les spécificateurs en gras sont pris en charge uniquement pour le débogage de code natif et C++/CLI. Cela nécessite le débogueur hérité, spécifié à l’aide du mode de compatibilité managé.
Symbole | Format | Valeur d’espion d’origine | Valeur affichée |
---|---|---|---|
ma | 64 caractères ASCII | 0x0012ffac | 0x0012ffac .4...0...".0W&.......1W&.0.:W..1...."..1.JO&.1.2.."..1...0y....1 |
m | 16 octets en hexadécimal suivis de 16 caractères ASCII | 0x0012ffac | 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&. |
mb | 16 octets en hexadécimal suivis de 16 caractères ASCII | 0x0012ffac | 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&. |
mw | 8 mots | 0x0012ffac | 0x0012ffac 34B3 00CB 3084 8094 22FF 308A 2657 0000 |
md | 4 mots doubles | 0x0012ffac | 0x0012ffac 00CB34B3 80943084 308A22FF 00002657 |
mq | 2 mots quadruples | 0x0012ffac | 0x0012ffac 7ffdf00000000000 5f441a790012fdd4 |
mu | caractères de 2 octets (Unicode) | 0x0012ffac | 0x0012ffac 8478 77f4 ffff ffff 0000 0000 0000 0000 |
Spécificateur de taille pour les pointeurs en tant que tableaux dans le débogage d’interopérabilité avec C++/CLI
Si vous avez un pointeur vers un objet que vous voulez afficher sous forme de tableau, vous pouvez utiliser un entier pour spécifier le nombre d’éléments du tableau.
Spécificateur | Format | Expression | Valeur affichée |
---|---|---|---|
n | entier décimal | pBuffer[32] | Affiche pBuffer sous forme de tableau de 32 éléments. |