Bagikan melalui


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, CFractionyang menentukan operator FixedPointfungsi 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 #definedengan 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 daripada str[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 atau Module.