Udostępnij za pośrednictwem


Specyfikatory formatu dla języka C++ w debugerze programu Visual Studio

Można zmienić format, w którym wartość jest wyświetlana w oknach Watch, Autos i Locals , używając specyfikatorów formatu.

Specyfikatory formatu można również używać w oknie Natychmiastowy , w oknie Polecenia , w punktach śledzenia, a nawet w oknach źródłowych. Jeśli wstrzymasz wyrażenie w tych oknach, wynik pojawi się w etykietce danych. Wyświetlanie etykietki danych odzwierciedla specyfikator formatu.

Uwaga

Gdy debuger natywny programu Visual Studio zmienił się na nowy aparat debugowania, dodano niektóre nowe specyfikatory formatu i usunięto niektóre stare. Starszy debuger jest nadal używany podczas międzyoperacyjnej (mieszanej natywnej i zarządzanej) debugowania za pomocą języka C++/CLI.

Ustawianie specyfikatorów formatu

Użyjemy następującego przykładowego kodu:

int main() {
    int my_var1 = 0x0065;
    int my_var2 = 0x0066;
    int my_var3 = 0x0067;
}

Dodaj zmienną my_var1 do okna Obserwowanie podczas debugowania, Debuguj >zegarek Windows>Watch>1. Następnie kliknij prawym przyciskiem myszy zmienną i wybierz pozycję Wyświetlacz szesnastkowy. Teraz w oknie Obserwowanie jest wyświetlana wartość 0x0065. Aby wyświetlić tę wartość wyrażoną jako znak, a nie liczbę całkowitą, najpierw kliknij prawym przyciskiem myszy i usuń zaznaczenie opcji Wyświetlanie szesnastkowe. Następnie dodaj specyfikator formatu znaków , c w kolumnie Nazwa po nazwie zmiennej. W kolumnie Wartość jest teraz wyświetlana wartość 101 "e".

Screenshot of the Visual Studio Watch window with one selected line that shows my_var1.c with a value of 101 'e' and a type of int.

Możesz wyświetlić i wybrać z listy dostępnych specyfikatorów formatu, dołączając przecinek (,) do wartości w oknie Obserwowanie .

WatchFormatSpecDropdown

Specyfikatory formatu

W poniższych tabelach opisano specyfikatory formatu, których można użyć w programie Visual Studio. Specyfikatory pogrubione są obsługiwane tylko dla nowego debugera, a nie debugowania międzyoperacyjnego za pomocą języka C++/CLI.

Specyfikator Formatuj Oryginalna wartość zegarka Wyświetlona wartość
d liczba całkowita dziesiętna 0x00000066 102
o niepodpisane ósemkowe liczby całkowite 0x00000066 000000000146
x

h
liczba całkowita szesnastkowa 102 0xcccccccc
X

H
liczba całkowita szesnastkowa 102 0xCCCCCCCC
Xb

Hb
liczba całkowita szesnastkowa (bez wiodącej liczby 0x) 102 cccccccc
Xb

Hb
liczba całkowita szesnastkowa (bez wiodącej liczby 0x) 102 CCCCCCCC
b liczba całkowita binarna bez znaku 25 0b0000000000000000000000000000011
Bb liczba całkowita binarna bez znaku wiodącego 0b 25 00000000000000000000000000011001
e zapis naukowy 25000000 2.500000e+07
g krótsze wartości naukowe lub zmiennoprzecinkowe 25000000 2.5e+07
c pojedynczy znak 0x0065 101 "e"
s ciąg const char* (z cudzysłowami) <lokalizacja> "hello world" "hello world"
sb ciąg const char* (bez znaków cudzysłowu) <lokalizacja> "hello world" Cześć ludzie
s8 Ciąg UTF-8 <lokalizacja> "To jest filiżanka kawy UTF-8 â ̃•" "To jest filiżanka ☕ kawy UTF-8 "
s8b Ciąg UTF-8 (bez cudzysłowów) <lokalizacja> "hello world" Cześć ludzie
Su Ciąg Unicode (kodowanie UTF-16) (z cudzysłowami) <lokalizacja> L"hello world" L"hello world"

u"hello world"
sub Ciąg Unicode (kodowanie UTF-16) (bez cudzysłowów) <lokalizacja> L"hello world" Cześć ludzie
bstr Ciąg binarny BSTR (ze znakami cudzysłowu) <lokalizacja> L"hello world" L"hello world"
Env Blok środowiska (ciąg zakończony o podwójnej wartości null) <location> L"=::=::\" L"=::=::\\\0=C:=C:\\windows\\system32\0ALLUSERSPROFILE=...
s32 Ciąg UTF-32 (ze znakami cudzysłowu) <location> U"hello world" U"hello world"
s32b Ciąg UTF-32 (bez znaków cudzysłowu) <location> U"hello world" Cześć ludzie
En wyliczenie Sobota (6) Sobota
Hv Typ wskaźnika — wskazuje, że sprawdzana wartość wskaźnika jest wynikiem alokacji sterty tablicy, na przykład new int[3]. <location>{<first member>} <location>{<first member, <second member>>, ...}
Na Pomija adres pamięci wskaźnika do obiektu. <location>, {member=value...} {member=value...}
Nd Wyświetla tylko informacje o klasie bazowej, ignorując klasy pochodne (Shape*) square zawiera informacje o klasie bazowej i klasie pochodnej Wyświetla tylko informacje o klasie bazowej
godz. HRESULT lub Win32 kod błędu. Ten specyfikator nie jest już potrzebny dla HRESULTs, ponieważ debuger dekoduje je automatycznie. S_OK S_OK
wc Flaga klasy okna 0x0010 WC_DEFAULTCHAR
Wm Numery komunikatów systemu Windows 16 WM_CLOSE
nr Pomijanie elementu "Widok pierwotny"
nvo Pokaż element "Widok pierwotny" tylko dla wartości liczbowych
! format pierwotny, ignorując dostosowania widoków typów danych <niestandardowa reprezentacja> 100
Obsługi Wyświetla informacje o dojściu win32 0x000000000000009c Wyświetla przydatne informacje o obsłudze, takiej jak identyfikator wątku itp.

Uwaga

Gdy specyfikator formatu hv jest obecny, debuger próbuje określić długość buforu i wyświetlić liczbę elementów. Ponieważ debuger nie zawsze jest możliwy do znalezienia dokładnego rozmiaru buforu tablicy, należy użyć specyfikatora (pBuffer,[bufferSize]) rozmiaru, jeśli to możliwe. Specyfikator formatu hv jest przydatny, gdy rozmiar buforu nie jest łatwo dostępny.

Specyfikatory rozmiaru wskaźników jako tablic

Jeśli masz wskaźnik do obiektu, który chcesz wyświetlić jako tablicę, możesz użyć liczby całkowitej lub wyrażenia, aby określić liczbę elementów tablicy.

Specyfikator Formatuj Oryginalna wartość zegarka Wyświetlona wartość
n Liczba całkowita dziesiętna lub szesnastkowa pBuffer,[32]

pBuffer,[0x20]
Wyświetla pBuffer jako tablicę elementów 32.
[exp] Prawidłowe wyrażenie języka C++, które daje w wyniku liczbę całkowitą. pBuffer,[bufferSize] Wyświetla wartość pBuffer jako tablicę bufferSize elementów.
expand(n) Prawidłowe wyrażenie języka C++, które daje w wyniku liczbę całkowitą pBuffer, expand(2) Wyświetla trzeci element elementu pBuffer

Specyfikatory formatu na potrzeby debugowania międzyoperacyjnego za pomocą języka C++/interfejsu wiersza polecenia

Specyfikator Formatuj Oryginalna wartość zegarka Wyświetlona wartość
o niepodpisane ósemkowe liczby całkowite 0xF065 0170145
x

X
Liczba całkowita szesnastkowa 61541 0x0000f065
c pojedynczy znak <location> 101 "e"
s const char* (z cudzysłowami) <location> "hello world"
Su const wchar_t*

const char16_t* (z cudzysłowami)
<location> L"hello world"
sub const wchar_t*

const char16_t*
<location> Cześć ludzie
s8 const char* (z cudzysłowami) <location> "hello world"
godz. HRESULT lub Win32 kod błędu.
Ten specyfikator nie jest już potrzebny dla HRESULTs, ponieważ debuger dekoduje je automatycznie.
S_OK S_OK
wc Flaga klasy okna 0x00000040, WC_DEFAULTCHAR
Wm Numery komunikatów systemu Windows 0x0010 WM_CLOSE
! format pierwotny, ignorując dostosowania widoku typu danych <niestandardowa reprezentacja> 100

D, e, f, g, h, i, l, m, ma, mb, md, mq, mu, mw i specyfikatory kodu natywnego i C++/CLI wymagały starszego debugera, który nie jest obsługiwany w programie Visual Studio 2022 lub nowszych wersjach.

Specyfikatory pogrubione są obsługiwane tylko w przypadku debugowania kodu natywnego i C++/CLI. Te specyfikatory wymagają starszego debugera określonego przy użyciu trybu zgodności zarządzanej.

Specyfikator Formatuj Oryginalna wartość zegarka Wyświetlona wartość
d

i
liczba całkowita ze znakiem dziesiętna 0xF000F065 -268373915
U liczba całkowita bez znaku dziesiętnego 0x0065 101
o niepodpisane ósemkowe liczby całkowite 0xF065 0170145
x

X
Liczba całkowita szesnastkowa 61541 0x0000f065
l

h
długi lub krótki prefiks dla: d, i, u, o, x, X 00406042 0x0c22
f ze znakiem zmiennoprzecinkowa (3./2.), f 1.500000
e podpisana notacja naukowa (3.0/2.0) 1.500000e+000
g podpisana zmiennoprzecinkowa lub podpisana notacja naukowa,
w zależności od tego, która wartość jest krótsza
(3.0/2.0) 1.5
c pojedynczy znak <location> 101 "e"
s const char* (z cudzysłowami) <location> "hello world"
Su const wchar_t*

const char16_t* (z cudzysłowami)
<location> L"hello world"
sub const wchar_t*

const char16_t*
<location> Cześć ludzie
s8 const char* (z cudzysłowami) <location> "hello world"
godz. HRESULT lub Win32 kod błędu.
Ten specyfikator nie jest już potrzebny dla HRESULTs, ponieważ debuger dekoduje je automatycznie.
S_OK S_OK
wc Flaga klasy okna 0x00000040, WC_DEFAULTCHAR
Wm Numery komunikatów systemu Windows 0x0010 WM_CLOSE
! format pierwotny, ignorując dostosowania widoku typu danych <niestandardowa reprezentacja> 100

Specyfikatory formatu dla lokalizacji pamięci w debugowaniu międzyoperacyjnym za pomocą języka C++/interfejsu wiersza polecenia

W poniższej tabeli opisano symbole formatowania używane dla lokalizacji pamięci. Można użyć specyfikatora lokalizacji pamięci z dowolną wartością lub wyrażeniem, które daje w wyniku lokalizację.

Specyfikatory pogrubione są obsługiwane tylko w przypadku debugowania kodu natywnego i C++/CLI. Wymaga to starszego debugera określonego przy użyciu trybu zgodności zarządzanej.

Symbol Formatuj Oryginalna wartość zegarka Wyświetlona wartość
ma 64 znaki ASCII 0x0012ffac 0x0012ffac .4...0...". 0W&...... 1W&.0.:W.. 1....".. 1.JO&.1.2.".". 1...0y.... 1
m 16 bajtów w szesnastkowym, a następnie 16 znaków ASCII 0x0012ffac 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00.4...0...". 0W&..
Mb 16 bajtów w szesnastkowym, a następnie 16 znaków ASCII 0x0012ffac 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00.4...0...". 0W&..
Mw 8 wyrazów 0x0012ffac 0x0012ffac 34B3 00CB 3084 8094 22FF 308A 2657 0000
Md 4 doublewords 0x0012ffac 0x0012ffac 00CB34B3 80943084 308A22FF 00002657
Mq 2 czworokąt 0x0012ffac 0x0012ffac 7ffdf000000000000 5f441a790012fdd4
mu 2-bajtowe znaki (Unicode) 0x0012ffac 0x0012ffac 8478 77f4 ffff ffff 0000 0000 0000 0000 0000

Specyfikator rozmiaru wskaźników jako tablic w debugowaniu międzyoperacyjnym za pomocą języka C++/CLI

Jeśli masz wskaźnik do obiektu, który chcesz wyświetlić jako tablicę, możesz użyć liczby całkowitej, aby określić liczbę elementów tablicy.

Specyfikator Formatuj Expression Wyświetlona wartość
n Liczba całkowita dziesiętna pBuffer[32] Wyświetla pBuffer jako tablicę 32-elementową.