Bagikan melalui


Penentu format untuk C++ di debugger Visual Studio

Anda dapat mengubah format di mana nilai ditampilkan di jendela Watch, Autos, dan Locals dengan menggunakan penentu format.

Anda juga dapat menggunakan penentu format di jendela Segera , jendela Perintah , di titik jejak, dan bahkan di jendela sumber. Jika Anda menjeda ekspresi di jendela tersebut, hasilnya akan muncul di DataTip. Tampilan DataTip mencerminkan penentu format.

Nota

Saat debugger asli Visual Studio berubah menjadi mesin debugging baru, beberapa penentu format baru ditambahkan dan beberapa yang lama dihapus. Debugger yang lebih lama masih digunakan saat Anda melakukan debugging interop (campuran native dan managed) dengan C++/CLI.

Mengatur spesifikator format

Kami akan menggunakan contoh kode berikut:

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

my_var1 Tambahkan variabel ke jendela Watch saat men-debug, Debug>Windows>Watch>Watch 1. Selanjutnya, klik kanan variabel dan pilih Tampilan Heksadesimal. Sekarang jendela Watch menampilkan nilai 0x0065. Untuk melihat nilai ini dinyatakan sebagai karakter daripada bilangan bulat, pertama-tama klik kanan dan batal pilih Tampilan Heksadesimal. Kemudian tambahkan penentu format karakter , c di kolom Nama setelah nama variabel. Kolom Nilai sekarang memperlihatkan 101 'e'.

Cuplikan layar jendela Visual Studio Watch dengan satu baris yang dipilih yang menampilkan my_var1.c dengan nilai 101 'e' dan jenis int.

Anda dapat melihat dan memilih dari daftar penentu format yang tersedia dengan menambahkan koma (,) ke nilai di jendela Watch .

WatchFormatSpecDropdown

Spesifikasi format

Tabel berikut ini menjelaskan penentu format yang bisa Anda gunakan di Visual Studio. Penentu dalam huruf tebal hanya didukung untuk digunakan dengan debugger baru, dan bukan untuk penelusuran kesalahan interop dengan C++/CLI.

Spesifikator Rancangan Nilai Jam Tangan Asli Nilai Ditampilkan
d bilangan bulat desimal 0x00000066 102
o bilangan bulat oktal yang tidak ditandatangani 0x00000066 000000000146
x

h
bilangan bulat heksadesimal 102 0xcccccccc
X

H
bilangan bulat heksadesimal 102 0xCCCCCCCC
Xb

Hb
bilangan bulat heksadesimal (tanpa leading 0x) 102 cccccccc
Xb

Hb
bilangan bulat heksadesimal (tanpa leading 0x) 102 CCCCCCCC
b bilangan bulat biner yang tidak ditandatangani Dua puluh lima 0b00000000000000000000000000011001
Bb bilangan bulat biner yang tidak ditandatangani(tanpa 0b di depan) Dua puluh lima 00000000000000000000000000011001
e notasi ilmiah 25000000 2.500000e+07
g versi singkat dari notasi ilmiah atau floating point 25000000 2.5e+07
c karakter tunggal 0x0065 101 'e'
s const char* string (dengan tanda kutip) <lokasi> "halo dunia" "halo dunia"
Sb const char* string (tanpa tanda kutip) <Lokasi> "Halo Dunia" Halo dunia
s8 String UTF-8 <lokasi> "Ini adalah cangkir kopi UTF-8 ☕" "Ini adalah cangkir ☕ kopi UTF-8"
s8b String UTF-8 (tanpa tanda kutip) <lokasi> "halo dunia" Halo dunia
Su String Unicode (pengodean UTF-16) (dengan tanda kutip) <location> L"hello world" L"halo dunia"

"halo dunia"
Subkategori String Unicode (pengodean UTF-16) (tanpa tanda kutip) <location> L"hello world" Halo dunia
bstr String biner BSTR (dengan tanda kutip) <location> L"hello world" L"halo dunia"
env Blok lingkungan (string yang diakhiri dengan null ganda) <location> L"=::=:::\\" L"=::=:\\\0=C:=C:\windows\\system32\0ALLUSERSPROFILE=...
s32 String UTF-32 (dengan tanda kutip) <location> U"hello world" U"halo dunia"
s32b String UTF-32 (tanpa tanda kutip) <location> U"hello world" Halo dunia
En enum Sabtu(6) Sabtu
Hv Jenis pointer - menunjukkan bahwa nilai pointer yang diperiksa adalah hasil dari alokasi heap sebuah array, misalnya, new int[3]. <lokasi>{<anggota pertama>} <lokasi>{<anggota pertama>, <anggota kedua>, ...}
Na Menyembunyikan alamat memori dari penunjuk ke objek. <lokasi>, {member=value...} {member=value...}
Nd Hanya menampilkan informasi kelas dasar, mengabaikan kelas turunan (Shape*) square termasuk kelas dasar dan informasi kelas turunan Hanya menampilkan informasi kelas dasar
hr Kode kesalahan HRESULT atau Win32. Penentu ini tidak lagi diperlukan untuk HRESULT karena debugger mendekodenya secara otomatis. S_OK S_OK
Wc Penanda kelas jendela 0x0010 WC_DEFAULTCHAR
Wm Nomor pesan Windows 16 WM_CLOSE
Nr Sembunyikan item "Tampilan Mentah"
nvo Perlihatkan item "Tampilan Baku" hanya untuk nilai numerik
! format mentah, mengabaikan kustomisasi tampilan jenis data apa pun <representasi yang disesuaikan> 4
handel Menampilkan informasi tentang handle win32 0x000000000000009c Menampilkan informasi yang berguna tentang handle seperti ID thread, dll.

Nota

Ketika penentu format hv ada, debugger mencoba menentukan panjang buffer dan menampilkan jumlah elemen tersebut. Karena tidak selalu mungkin bagi debugger untuk menemukan ukuran buffer array yang tepat, Anda harus menggunakan penentu (pBuffer,[bufferSize]) ukuran jika memungkinkan. Penentu format hv berguna ketika ukuran buffer tidak tersedia.

Penentu ukuran untuk pointer sebagai array

Jika Anda memiliki penunjuk ke objek yang ingin Anda lihat sebagai array, Anda bisa menggunakan bilangan bulat atau ekspresi untuk menentukan jumlah elemen array.

Spesifikator Rancangan Nilai Jam Tangan Asli Nilai Ditampilkan
n Bilangan bulat desimal atau heksadesimal pBuffer,[32]

pBuffer,[0x20]
pBuffer Ditampilkan sebagai array elemen 32.
[exp] Ekspresi C++ valid yang mengevaluasi ke bilangan bulat. pBuffer,[bufferSize] Menampilkan pBuffer sebagai elemen array bufferSize.
expand(n) Ekspresi C++ valid yang mengevaluasi ke bilangan bulat pBuffer, expand(2) Menampilkan elemen ketiga dari pBuffer

Penentu format untuk debugging interopabilitas dengan C++/CLI

Pengatur Spesifikasi Rancangan Nilai Jam Tangan Asli Nilai Ditampilkan
o bilangan bulat oktal yang tidak ditandatangani 0xF065 0170145
x

X
Bilangan bulat heksadesimal 61541 0x0000f065
c karakter tunggal <lokasi> 101 'e'
s const char* (dengan tanda kutip) <lokasi> "halo dunia"
Su const wchar_t*

const char16_t* (dengan tanda kutip)
<lokasi> L"halo dunia"
Subkategori const wchar_t*

const char16_t*
<lokasi> Halo dunia
s8 const char* (dengan tanda kutip) <lokasi> "halo dunia"
hr Kode kesalahan HRESULT atau Win32.
Penentu ini tidak lagi diperlukan untuk HRESULT karena debugger mendekodenya secara otomatis.
S_OK S_OK
wc Penanda kelas jendela 0x00000040, WC_DEFAULTCHAR
wm Nomor pesan Windows 0x0010 WM_CLOSE
! format mentah, mengabaikan kustomisasi tampilan jenis data apa pun <representasi yang disesuaikan> 4

Kode d, e, f, g, h, i, l, m, ma, mb, md, mq, mu, mw, dan u specifier untuk kode asli dan C++/CLI memerlukan debugger lama, yang tidak didukung dalam Visual Studio 2022 atau versi yang lebih baru.

Spesifikator dalam huruf tebal hanya didukung untuk debug kode asli dan C++/CLI. Penentu ini memerlukan debugger warisan, yang ditentukan menggunakan Mode Kompatibilitas Terkelola.

Spesifikator Rancangan Nilai Jam Tangan Asli Nilai Ditampilkan
d

saya
bilangan bulat desimal yang ditandatangani 0xF000F065 -268373915
u bilangan bulat desimal yang tidak ditandatangani 0x0065 101
o bilangan bulat oktal yang tidak ditandatangani 0xF065 0170145
x

X
Bilangan bulat heksadesimal 61541 0x0000f065
l

h
awalan panjang atau pendek untuk: d, i, u, o, x, X 00406042 0x0c22
f titik mengambang yang ditandatangani (3./2.), f 1.500000
e notasi ilmiah yang ditandatangani (3.0/2.0) 1.500000e+000
g titik mengambang yang ditandatangani atau notasi ilmiah yang ditandatangani,
mana yang lebih pendek
(3.0/2.0) 1.5
c karakter tunggal <lokasi> 101 'e'
s const char* (dengan tanda kutip) <lokasi> "halo dunia"
Su const wchar_t*

const char16_t* (dengan tanda kutip)
<lokasi> L"halo dunia"
Subkategori const wchar_t*

const char16_t*
<lokasi> Halo dunia
s8 const char* (dengan tanda kutip) <lokasi> "halo dunia"
hr Kode kesalahan HRESULT atau Win32.
Penentu ini tidak lagi diperlukan untuk HRESULT karena debugger mendekodenya secara otomatis.
S_OK S_OK
wc Penanda kelas jendela 0x00000040, WC_DEFAULTCHAR
wm Nomor pesan Windows 0x0010 WM_CLOSE
! format mentah, mengabaikan kustomisasi tampilan jenis data apa pun <representasi yang disesuaikan> 4

Penentu format untuk alamat memori dalam debugging interop dengan C++/CLI

Tabel berikut ini menjelaskan simbol pemformatan yang digunakan untuk lokasi memori. Anda dapat menggunakan penentu lokasi memori dengan nilai atau ekspresi apa pun yang menunjuk ke lokasi.

Spesifikator dalam huruf tebal hanya didukung untuk debug kode asli dan C++/CLI. Ini memerlukan debugger warisan, yang ditentukan menggunakan Mode Kompatibilitas Terkelola.

Symbol Rancangan Nilai Jam Tangan Asli Nilai Ditampilkan
Ma 64 karakter ASCII 0x0012ffac 0x0012ffac .4...0...". 0W&....... 1W&.0.:W.. 1....".. 1.JO&.1.2..".. 1...0y.... 1
m 16 byte dalam heksadesimal, diikuti oleh 16 karakter ASCII 0x0012ffac 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&..
Mb 16 byte dalam heksadesimal, diikuti oleh 16 karakter ASCII 0x0012ffac 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&..
mw 8 kata 0x0012ffac 0x0012ffac 34B3 00CB 3084 8094 22FF 308A 2657 0000
md 4 kata sandi ganda 0x0012ffac 0x0012ffac 00CB34B3 80943084 308A22FF 00002657
mq 2 quadwords 0x0012ffac 0x0012ffac 7ffdf00000000000 5f441a790012fdd4
mu Karakter berukuran 2 byte (Unicode) 0x0012ffac 0x0012ffac 8478 77f4 ffff ffff 0000 0000 0000 0000

Penentu ukuran untuk pointer sebagai array dalam debugging interop dengan C++/CLI

Jika Anda memiliki penunjuk ke objek yang ingin Anda lihat sebagai array, Anda dapat menggunakan bilangan bulat untuk menentukan jumlah elemen array.

Spesifikator Rancangan Expression Nilai Ditampilkan
n Bilangan bulat desimal pBuffer[32] Menampilkan pBuffer sebagai array berisi 32 elemen.