Ekspresi dalam debugger Visual Studio
Debugger Visual Studio menyertakan evaluator ekspresi yang berfungsi saat Anda memasukkan ekspresi dalam kotak dialog QuickWatch, jendela Pengawasan, atau jendela Langsung. Evaluator ekspresi juga berfungsi di jendela Titik Henti dan banyak tempat lain di debugger.
Bagian berikut menjelaskan batasan evaluasi ekspresi untuk bahasa yang didukung oleh Visual Studio.
Ekspresi F# tidak didukung
Ekspresi F# tidak dikenali. Jika Anda men-debug kode F#, Anda perlu menerjemahkan ekspresi Anda ke dalam sintaks C# sebelum memasukkan ekspresi ke jendela debugger atau kotak dialog. Saat Anda menerjemahkan ekspresi dari F# ke C#, pastikan untuk mengingat bahwa C# menggunakan ==
operator untuk menguji kesetaraan, sementara F# menggunakan satu =
.
Expresi C++
Untuk informasi tentang menggunakan operator konteks dengan ekspresi di C++, lihat Operator Konteks (C++).
Ekspresi yang Tidak Didukung di C++
Konstruktor, destruktor, dan konversi
Anda tidak dapat memanggil konstruktor atau destruktor untuk objek, baik secara eksplisit maupun implisit. Misalnya, ekspresi berikut secara eksplisit memanggil konstruktor dan menghasilkan pesan kesalahan:
my_date( 2, 3, 1985 )
Anda tidak dapat memanggil fungsi konversi jika tujuan konversi adalah kelas. Konversi semacam itu melibatkan pembangunan objek. Misalnya, jika myFraction
adalah instans, CFraction
yang menentukan operator FixedPoint
fungsi konversi, ekspresi berikut menghasilkan kesalahan:
(FixedPoint)myFraction
Anda tidak dapat memanggil operator baru atau menghapus. Misalnya, ekspresi berikut tidak didukung:
new Date(2,3,1985)
Makro Praprosesor
Makro praprosesor tidak didukung di debugger. Misalnya, jika konstanta VALUE
dinyatakan sebagai: #define VALUE 3
, Anda tidak dapat menggunakan VALUE
di jendela Watch . Untuk menghindari batasan ini, Anda harus mengganti #define
dengan enum dan fungsi jika memungkinkan.
menggunakan deklarasi namespace
Anda tidak dapat menggunakan using namespace
deklarasi. Untuk mengakses nama jenis atau variabel di luar namespace saat ini, Anda harus menggunakan nama yang sepenuhnya memenuhi syarat.
Namespace anonim
Namespace anonim tidak didukung. Jika Anda memiliki kode berikut, Anda tidak dapat menambahkan test
ke jendela tonton:
namespace mars
{
namespace
{
int test = 0;
}
}
int main()
{
// Adding a watch on test doesn't work.
mars::test++;
return 0;
}
Menggunakan fungsi intrinsik debugger untuk mempertahankan status
Fungsi intrinsik debugger memberi Anda cara untuk memanggil fungsi C/C++ tertentu dalam ekspresi tanpa mengubah status aplikasi.
Fungsi intrinsik debugger:
Dijamin aman: menjalankan fungsi intrinsik debugger tidak akan merusak proses yang sedang di-debug.
Diizinkan dalam semua ekspresi , bahkan dalam skenario di mana efek samping dan evaluasi fungsi tidak diizinkan.
Bekerja dalam skenario di mana panggilan fungsi reguler tidak dimungkinkan, seperti men-debug minidump.
Fungsi intrinsik debugger juga dapat membuat ekspresi evaluasi lebih nyaman. Misalnya,
strncmp(str, "asd")
jauh lebih mudah untuk menulis dalam kondisi titik henti daripadastr[0] == 'a' && str[1] == 's' && str[2] == 'd'
. )
Luas | Fungsi intrinsik |
---|---|
Panjang string | strlen, wcslen, strnlen, wcsnlen |
Perbandingan string | strcmp, wcscmp, stricmp, wcsicmp, _stricmp, _strcmpi, _wcsicmp, _wcscmpi, strncmp, wcsncmp, strnicmp, wcsnicmp, _strnicmp, _wcsnicmp |
Pencarian string | strchr, wcschr, memchr, wmemchr, strstr, wcsstr |
Win32 | CoDecodeProxy, DecodePointer, GetLastError, TlsGetValue |
Windows 8 | RoInspectCapturedStackBackTrace, WindowsCompareStringOrdinal, WindowsGetStringLen, WindowsGetStringRawBuffer Fungsi-fungsi ini memerlukan proses yang sedang di-debug agar berjalan pada Windows 8. Men-debug file cadangan yang dihasilkan dari perangkat Windows 8 juga mengharuskan komputer Visual Studio menjalankan Windows 8. Namun, jika Anda men-debug perangkat Windows 8 dari jarak jauh, komputer Visual Studio dapat menjalankan Windows 7. WindowsGetStringLen dan WindowsGetStringRawBuffer hanya digunakan oleh mesin eksekusi (EE) pada tingkat sumber. |
Lain-Lain | __log2 - Mengembalikan basis log 2 dari bilangan bulat tertentu, dibulatkan ke bilangan bulat bawah terdekat. __findNonNull - Mencari array pointer, mengembalikan indeks elemen non-null pertama. - Parameter: (1) Penunjuk ke elemen pertama dalam array (batal*), (2) Ukuran array (int tidak ditandatangani). - Mengembalikan nilai: (1) indeks berbasis 0 dari elemen non-null pertama dalam array atau -1 jika tidak ditemukan. DecodeHString - untuk memformat nilai HSTRING. Memunculkan nilai HSTRING dari tumpukan, mendorong byte struktur StringInfo yang dapat digunakan EE untuk mengetahui di mana string berada. Ini hanya digunakan secara internal oleh EE; tidak tersedia untuk pengguna untuk memanggil secara langsung. DecodeWinRTRestrictedException - Mendekode pengecualian terbatas WinRT untuk mendapatkan deskripsi terbatas. - Parameter: (1) karakter string yang dihentikan null yang mewakili string referensi terbatas. - Nilai pengembalian: Karakter string yang dihentikan null yang berisi pesan kesalahan aktual untuk ditampilkan. DynamicCast - Menerapkan dynamic_cast. - Parameter: (1) Penunjuk ke objek untuk dilemparkan. - Item data: Objek CDynamicCastData harus dikaitkan sebagai item data ke instruksi ExecuteIntrinsic() yang sesuai. Item data mengodekan jenis yang kami transmisikan dari dan ke, serta apakah kami mengevaluasi ekspresi natvis atau tidak (diperlukan agar diagnostik memutus rekursi tak terbatas). - Mengembalikan nilai: (1) Penunjuk ke objek, dilemparkan ke jenis yang benar, atau NULL jika objek yang dilemparkan bukan instans dari jenis yang benar. DynamicMemberLookup - Fungsi pembantu untuk mendapatkan nilai anggota kelas secara dinamis GetEnvBlockLength - Fungsi pembantu untuk mendapatkan panjang blok lingkungan, dalam karakter. Digunakan untuk $env. Stdext_HashMap_Int_OperatorBracket_idx - Operator[] untuk stdext::hash_map. Mengasumsikan fungsi hash default dengan kunci 'int'. Mengembalikan nilai. Operator intrinsik[] hanya mendukung pengambilan item yang ada dari hashtable - tidak mendukung penyisipan item baru ke dalam tabel, karena dapat melibatkan kompleksitas yang tidak diinginkan, seperti alokasi memori. Namun, operator[] dapat digunakan untuk memodifikasi nilai yang terkait dengan kunci yang sudah ada dalam tabel. - Parameter Tumpukan: (1) Alamat objek stdext::hash_map, (2) Kunci ke dalam tabel (int), (3) struktur HashMapPdb yang menentukan offset bidang anggota yang perlu dilakukan implementasi fungsi untuk melakukan pencarian. Ini diperlukan karena akses langsung ke simbol tidak tersedia di sisi jarak jauh. - Mengembalikan nilai: (1) Jika kunci berada dalam tabel, alamat nilai yang sesuai dengan kunci. Jika tidak, NULL. Std_UnorderedMap_Int_OperatorBracket_idx - std::unordered_map bekerja dengan cara yang sama seperti stdext::hash_map, kecuali fungsi hash berbeda. ConcurrencyArray_OperatorBracket_idx // Concurrency::array<>::operator[index<>] dan operator(index<>) ConcurrencyArray_OperatorBracket_int // Konkurensi::array<>::operator(int, int, ...) ConcurrencyArray_OperatorBracket_tidx // Konkurensi::array<>::operator[tiled_index<>] dan operator(tiled_index<>) ConcurrencyArrayView_OperatorBracket_idx // Konkurensi::array_view<>::operator[index<>] dan operator(index<>) ConcurrencyArrayView_OperatorBracket_int // Konkurensi::array_view<>::operator(int, int, ...) ConcurrencyArrayView_OperatorBracket_tidx // Konkurensi::array_view<>::operator[tiled_index<>] dan operator(tiled_index<>) TreeTraverse_Init - Menginisialisasi traversal pohon baru. Mendukung visualizer berbasis ekstensi, tidak dimaksudkan untuk digunakan dalam file .natvis . TreeTraverse_Next - Mengambil simpul dari traversal pohon yang tertunda. Mendukung visualizer berbasis ekstensi, tidak dimaksudkan untuk digunakan dalam file .natvis . TreeTraverse_Skip - Melompati simpul di traversal pohon yang tertunda. Mendukung visualizer berbasis ekstensi, tidak dimaksudkan untuk digunakan dalam file .natvis . |
C++/CLI - Ekspresi Yang Tidak Didukung
Cast yang melibatkan pointer, atau cast yang ditentukan pengguna, tidak didukung.
Perbandingan objek dan penugasan tidak didukung.
Operator yang kelebihan beban dan fungsi yang kelebihan beban tidak didukung.
Tinju dan pembukaan kotak tidak didukung.
Sizeof
operator tidak didukung.
C# - Ekspresi Yang Tidak Didukung
Objek Dinamis
Anda dapat menggunakan variabel dalam ekspresi debugger yang diketik secara statis sebagai dinamis. Saat objek yang menerapkan IDynamicMetaObjectProvider dievaluasi di jendela Pengawasan, simpul Tampilan Dinamis ditambahkan. Simpul Tampilan Dinamis memperlihatkan anggota objek tetapi tidak mengizinkan pengeditan nilai anggota.
Fitur objek dinamis berikut tidak didukung:
Operator gabungan
+=
,-=
,%=
,/=
, dan*=
Banyak cast, termasuk cast numerik dan cast type-argument
Panggilan metode dengan lebih dari dua argumen
Properti getter dengan lebih dari dua argumen
Setter properti dengan argumen
Menetapkan ke pengindeks
Operator Boolean
&&
dan||
Metode anonim
Pembuatan metode anonim baru tidak didukung.
Visual Basic - Ekspresi Yang Tidak Didukung
Objek Dinamis
Anda dapat menggunakan variabel dalam ekspresi debugger yang diketik secara statis sebagai dinamis. Saat objek yang mengimplementasikan IDynamicMetaObjectProvider dievaluasi di jendela Pengawasan, simpul Tampilan Dinamis ditambahkan. Simpul Tampilan Dinamis memperlihatkan anggota objek tetapi tidak mengizinkan pengeditan nilai anggota.
Fitur objek dinamis berikut tidak didukung:
Operator gabungan
+=
,-=
,%=
,/=
, dan*=
Banyak cast, termasuk cast numerik dan cast type-argument
Panggilan metode dengan lebih dari dua argumen
Properti getter dengan lebih dari dua argumen
Setter properti dengan argumen
Menetapkan ke pengindeks
Operator Boolean
&&
dan||
Konstanta Lokal
Konstanta lokal tidak didukung.
Alias Impor
Alias impor tidak didukung.
Deklarasi Variabel
Anda tidak dapat mendeklarasikan variabel baru eksplisit di jendela debugger. Namun, Anda dapat menetapkan variabel implisit baru di dalam jendela Langsung. Variabel implisit ini dilingkup ke sesi debug dan tidak dapat diakses di luar debugger. Misalnya, pernyataan o = 5
secara implisit membuat variabel o
baru dan menetapkan nilai 5 ke dalamnya. Variabel implisit tersebut berjenis Objek kecuali jenisnya dapat disimpulkan oleh debugger.
Kata Kunci yang Tidak Didukung
AddressOf
End
Error
Exit
Goto
On Error
Resume
Return
Select/Case
Stop
SyncLock
Throw
Try/Catch/Finally
With
Namespace layanan atau kata kunci tingkat modul, seperti
End Sub
atauModule
.