Bagikan melalui


Mengamati variabel menggunakan jendela Watch dan QuickWatch

Saat menelusuri kesalahan, Anda dapat menggunakan jendela Watch dan QuickWatch untuk mengamati variabel dan ekspresi. Jendela hanya tersedia selama sesi penelusuran kesalahan.

Jendela Watch dapat menampilkan beberapa variabel sekaligus saat penelusuran kesalahan. Dialog QuickWatch menampilkan satu variabel dalam satu waktu dan harus ditutup sebelum penelusuran kesalahan dapat dilanjutkan. Untuk informasi selengkapnya tentang menggunakan QuickWatch, lihat Mengamati satu variabel atau ekspresi menggunakan QuickWatch.

Catatan

Jika ini pertama kalinya Anda mencoba menelusuri kesalahan kode, Anda mungkin ingin membaca Penelusuran kesalahan bagi pemula serta Teknik dan alat penelusuran kesalahan sebelum membaca artikel ini.

Mengamati variabel menggunakan jendela Watch

Anda dapat membuka lebih dari satu jendela Watch dan mengamati lebih dari satu variabel di jendela Watch.

Misalnya, untuk mengatur pengamatan pada nilai a, b, dan c dalam kode berikut:

int main()
{
    int a, b, c;
    a = 1;
    b = 2;
    c = 0;

    for (int i = 0; i < 10; i++)
    {
        a++;
        b *= 2;
        c = a + b;
    }

    return 0;
}

  1. Atur titik henti pada baris c = a + b; dengan mengklik di margin sebelah kiri, memilih Debug>Aktifkan/Nonaktifkan Titik Henti, atau menekan F9.

  2. Mulai penelusuran kesalahan dengan memilih panah Mulai berwarna hijau atau Debug>Mulai Penelusuran Kesalahan, atau tekan F5. Eksekusi dijeda pada titik henti.

  3. Buka jendela Watch dengan memilih Debug>Windows>Watch>Watch 1, atau tekan Ctrl+Alt+W>1.

    Anda dapat membuka jendela Watch tambahan dengan memilih windows 2, 3, atau 4.

  4. Di jendela Watch, pilih baris kosong dan ketik variabel a. Lakukan hal yang sama untuk b dan c.

    Screenshot of Watch variables.

    Screenshot of Watch variables.

  5. Lanjutkan penelusuran kesalahan dengan memilih Debug>Step Into atau tekan F11 sesuai kebutuhan untuk melanjutkan. Nilai variabel di jendela Watch berubah saat Anda melakukan iterasi melalui perulangan for.

Catatan

Khusus untuk C++,

  • Anda mungkin perlu memenuhi persyaratan konteks nama variabel atau ekspresi yang menggunakan nama variabel. Konteks tersebut adalah fungsi, file sumber, atau modul tempat variabel berada. Jika Anda harus memenuhi persyaratan konteks, gunakan sintaks operator konteks (C++) pada Nama di jendela Watch.

  • Anda dapat menambahkan nama pendaftaran dan nama variabel menggunakan $<>nama pendaftaran atau @<>nama pendaftaran ke Nama di jendela Watch. Untuk informasi selengkapnya, lihat Pseudovariables.

Menggunakan ekspresi di jendela Watch

Anda dapat mengamati ekspresi valid apa pun yang dikenali oleh penelusur kesalahan di jendela Watch.

Misalnya, untuk kode di bagian sebelumnya, Anda bisa mendapatkan rata-rata dari tiga nilai tersebut dengan memasukkan (a + b + c) / 3 di jendela Watch:

Screenshot of Watch expression.

Screenshot of Watch expression.

Aturan untuk mengevaluasi ekspresi di jendela Watch umumnya sama dengan aturan untuk mengevaluasi ekspresi di bahasa kode. Jika ekspresi memiliki kesalahan sintaksis, biasanya sama seperti kesalahan pengompilasi di editor kode. Misalnya, kesalahan ketik dalam ekspresi sebelumnya menghasilkan kesalahan ini di jendela Watch:

Screenshot of Watch expression error.

Screenshot of Watch expression error.

Lingkaran dengan dua ikon garis bergelombang dapat muncul di jendela Watch. Ikon ini memiliki arti bahwa penelusur kesalahan tidak mengevaluasi ekspresi karena potensi dependensi lintas alur. Mengevaluasi kode mengharuskan alur lain di aplikasi Anda berjalan untuk sementara waktu, tetapi karena Anda dalam mode istirahat, semua alur di aplikasi Anda biasanya dihentikan. Mengizinkan alur lain berjalan untuk sementara waktu dapat memiliki efek tak terduga pada status aplikasi Anda dan penelusur kesalahan dapat mengabaikan peristiwa seperti titik henti dan pengecualian pada alur tersebut.

Pencarian di jendela Watch

Anda dapat mencari kata kunci di kolom Nama, Nilai, dan Jenis dari jendela Watch menggunakan bilah pencarian di atas setiap jendela. Tekan ENTER atau pilih salah satu panah untuk menjalankan pencarian. Untuk membatalkan pencarian yang sedang berlangsung, pilih ikon "x" di bilah pencarian.

Gunakan panah kiri dan kanan (masing-masing Shift+F3 dan F3) untuk beralih di antara kecocokan yang ditemukan.

Screenshot of Search in Watch Window.

Untuk membuat pencarian Anda lebih atau kurang menyeluruh, gunakan menu drop-down Cari Lebih Dalam di bagian atas jendela Watch guna memilih tingkatan terkait seberapa dalam Anda ingin mencari ke dalam objek berlapis.

Menyematkan properti di jendela Watch

Catatan

Fitur ini didukung di .NET Core 3.0 atau yang lebih tinggi.

Anda dapat dengan cepat memeriksa objek berdasarkan propertinya di jendela Watch menggunakan alat Properti yang Dapat Disematkan. Untuk menggunakan alat ini, arahkan kursor ke properti dan pilih ikon sematkan yang muncul atau klik kanan dan pilih opsi Sematkan Anggota sebagai Favorit di menu konteks yang dihasilkan. Langkah ini menempatkan properti tersebut ke bagian atas daftar properti objek dan nama serta nilai propertinya ditampilkan di kolom Nilai. Untuk melepaskan semat properti, pilih ikon sematkan lagi atau pilih opsi Lepaskan Anggota sebagai Favorit di menu konteks.

Screenshot of Pin properties in the Watch window.

Anda juga dapat mengalihkan nama properti dan memfilter properti yang tidak disematkan saat melihat daftar properti objek di jendela Watch. Anda dapat mengakses kedua opsi dengan memilih tombol pada toolbar di atas jendela pengamatan.

Merefresh nilai pengamatan

Ikon refresh (panah melingkar) mungkin muncul di jendela Watch saat ekspresi dievaluasi. Ikon refresh mengindikasikan kesalahan atau nilai yang sudah kedaluwarsa.

Untuk me-refresh nilai, pilih ikon refresh, atau tekan bilah spasi. Penelusur kesalahan mencoba mengevaluasi ulang ekspresi. Namun, Anda mungkin tidak ingin atau tidak dapat mengevaluasi ulang ekspresi, tergantung pada alasan nilai tidak dievaluasi.

Arahkan mouse ke ikon refresh atau lihat kolom Nilai untuk mengetahui alasan ekspresi tidak dievaluasi. Alasannya meliputi:

  • Terjadi kesalahan saat ekspresi sedang dievaluasi, seperti pada contoh sebelumnya. Waktu habis mungkin terjadi atau variabel mungkin berada di luar cakupan.

  • Ekspresi memiliki panggilan fungsi yang dapat memicu efek samping pada aplikasi. Lihat Efek samping ekspresi.

  • Evaluasi otomatis properti dan panggilan fungsi implisit dinonaktifkan.

Jika ikon refresh muncul karena evaluasi otomatis properti dan panggilan fungsi implisit dinonaktifkan, Anda dapat mengaktifkannya dengan memilih Aktifkan evaluasi properti dan panggilan fungsi implisit lainnya di Alat>Opsi>Penelusuran Kesalahan>Umum.

Untuk mendemonstrasikan penggunaan ikon refresh:

  1. Di Alat>Opsi>Penelusuran Kesalahan>Umum, kosongkan kotak centang Aktifkan evaluasi properti dan panggilan fungsi implisit lainnya.

  2. Masukkan kode berikut, lalu di jendela Watch, atur pengamatan pada properti list.Count.

    static void Main(string[] args)
    {
        List<string> list = new List<string>();
        list.Add("hello");
        list.Add("goodbye");
    }
    
  3. Mulai penelusuran kesalahan. Jendela Watch menampilkan sesuatu seperti pesan berikut:

    Screenshot of Refresh Watch.

    Screenshot of Refresh Watch.

  4. Untuk me-refresh nilai, pilih ikon refresh, atau tekan bilah spasi. Penelusur kesalahan mengevaluasi ulang ekspresi.

Efek samping ekspresi

Mengevaluasi beberapa ekspresi dapat mengubah nilai variabel atau memengaruhi status aplikasi Anda. Misalnya, mengevaluasi ekspresi berikut mengubah nilai var1:

var1 = var2

Kode ini dapat menyebabkan efek samping. Efek samping dapat menyebabkan penelusuran kesalahan menjadi lebih sulit dengan mengubah cara aplikasi Anda beroperasi.

Ekspresi dengan efek samping dievaluasi hanya sekali, saat Anda pertama kali memasukkannya. Setelah itu, ekspresi tersebut tampak berwarna abu-abu di jendela Watch dan evaluasi lebih lanjut dinonaktifkan. Tooltip atau kolom Nilai menjelaskan bahwa ekspresi tersebut menyebabkan efek samping. Anda dapat mengevaluasi ulang secara paksa dengan memilih ikon refresh yang muncul di samping nilai.

Salah satu cara untuk mencegah penunjukan efek samping adalah dengan menonaktifkan evaluasi fungsi otomatis. Di Alat>Opsi>Penelusuran Kesalahan>Umum, kosongkan kotak centang Aktifkan evaluasi properti dan panggilan fungsi implisit lainnya.

Khusus untuk C#, saat evaluasi properti atau panggilan fungsi implisit dinonaktifkan, Anda dapat mengevaluasi secara paksa dengan menambahkan pengubah format ac ke Nama variabel di jendela Watch. Lihat Penentu format di C#.

Menggunakan ID Objek di jendela Watch (C# dan Visual Basic)

Ada kalanya Anda ingin mengamati perilaku objek tertentu. Misalnya, Anda mungkin ingin melacak objek yang dirujuk oleh variabel lokal setelah variabel tersebut keluar dari cakupan. Di C# dan Visual Basic, Anda dapat membuat ID objek untuk instans tertentu dari jenis referensi dan menggunakannya di jendela Watch serta dalam kondisi titik henti. ID objek tersebut dihasilkan oleh layanan penelusuran kesalahan runtime bahasa umum (CLR) dan terkait dengan objek.

Catatan

ID objek membuat referensi lemah yang tidak mencegah objek dikumpulkan sebagai sampah. Mereka hanya valid untuk sesi penelusuran kesalahan saat ini.

Dalam kode berikut, metode MakePerson() membuat Person menggunakan variabel lokal:

class Person
{
    public Person(string name)
    {
        Name = name;
    }
    public string Name { get; set; }
}

public class Program
{
    static List<Person> _people = new List<Person>();
    public static void Main(string[] args)
    {
        MakePerson();
        DoSomething();
    }

    private static void MakePerson()
    {
        var p = new Person("Bob");
        _people.Add(p);
    }

    private static void DoSomething()
    {
        // more processing
         Console.WriteLine("done");
    }
}

Untuk mengetahui nama Person dalam metode DoSomething(), Anda dapat menambahkan referensi ke ID Objek Person di jendela Watch.

  1. Atur titik henti dalam kode setelah objek Person dibuat.

  2. Mulai penelusuran kesalahan.

  3. Saat eksekusi dijeda di titik henti, buka jendela Lokal dengan memilih Debug>Windows>Lokal.

  4. Di jendela Lokal, klik kanan variabel Person dan pilih Buat ID Objek.

    Anda akan melihat tanda dolar ($) juga angka di jendela Lokal, yang merupakan ID Objek.

  5. Tambahkan ID objek ke jendela Watch dengan mengklik kanan ID Objek dan memilih Tambahkan Pengamatan.

  6. Atur titik henti lain dalam metode DoSomething().

  7. Lanjutkan penelusuran kesalahan. Saat eksekusi dijeda dalam metode DoSomething(), jendela Watch menampilkan objek Person.

    Catatan

    Jika Anda ingin melihat properti objek, seperti Person.Name, Anda harus mengaktifkan evaluasi properti dengan memilih Alat>Opsi>Penelusuran Kesalahan>Umum>Aktifkan evaluasi properti dan panggilan fungsi implisit lainnya.

Jendela Watch dan Tampilan Dinamis

Beberapa bahasa skrip (misalnya, JavaScript atau Python) menggunakan pengetikan dinamis atau duck dan .NET versi 4.0 serta yang lebih baru mendukung objek yang sulit diamati di jendela penelusuran kesalahan normal.

Jendela Watch menampilkan objek ini sebagai objek dinamis, yang dibuat dari jenis yang mengimplementasikan antarmuka IDynamicMetaObjectProvider. Node objek dinamis menunjukkan anggota dinamis dari objek dinamis, tetapi tidak mengizinkan pengeditan nilai anggota.

Untuk me-refresh nilai Tampilan Dinamis, pilih ikon refresh di samping node objek dinamis.

Guna hanya menampilkan Tampilan Dinamis untuk objek, tambahkan penentu format dinamis setelah nama objek dinamis di jendela Watch:

  • Untuk C#: ObjectName, dynamic
  • Untuk Visual Basic: $dynamic, ObjectName

Catatan

  • Penelusur kesalahan C# tidak secara otomatis mengevaluasi ulang nilai dalam Tampilan Dinamis saat Anda melangkah ke baris kode berikutnya.
  • Penelusur kesalahan Visual Basic secara otomatis me-refresh ekspresi yang ditambahkan melalui Tampilan Dinamis.
  • Mengevaluasi anggota Tampilan Dinamis dapat menimbulkan efek samping.

Untuk menyisipkan variabel pengamatan baru yang mentransmisikan objek menjadi objek dinamis:

  1. Klik kanan anak mana pun dari Tampilan Dinamis.
  2. Pilih Tambahkan Pengamatan. object.name menjadi ((dynamic) object).name dan muncul di jendela Watch baru.

Penelusur kesalahan juga menambahkan node anak Tampilan Dinamis dari objek ke jendela Otomatis. Untuk membuka jendela Otomatis, selama penelusuran kesalahan, pilih Debug>Windows>Otomatis.

Tampilan Dinamis juga meningkatkan penelusuran kesalahan untuk objek COM. Ketika penelusur kesalahan mencapai objek COM yang dibungkus dalam System.__ComObject, ia menambahkan node Tampilan Dinamis untuk objek tersebut.

Mengamati satu variabel atau ekspresi menggunakan QuickWatch

Anda dapat menggunakan QuickWatch untuk mengamati satu variabel.

Misalnya, untuk kode berikut:

static void Main(string[] args)
{
    int a, b;
    a = 1;
    b = 2;
    for (int i = 0; i < 10; i++)
    {
        a = a + b;
    }
}

Untuk mengamati variabel a,

  1. Atur titik henti a = a + b; pada baris.

  2. Mulai penelusuran kesalahan. Eksekusi dijeda pada titik henti.

  3. Pilih variabel a di dalam kode.

  4. Pilih Debug>QuickWatch, tekan Shift+F9, atau klik kanan dan pilih QuickWatch.

    Dialog QuickWatch muncul. Variabel a berada dalam kotak Ekspresi dengan Nilai1.

    Screenshot of QuickWatch variable.

    Screenshot of QuickWatch variable.

  5. Untuk mengevaluasi ekspresi menggunakan variabel, ketik ekspresi seperti a + b di kotak Ekspresi, dan pilih Evaluasi Ulang.

    Screenshot of QuickWatch expression.

    Screenshot of QuickWatch expression.

  6. Untuk menambahkan variabel atau ekspresi dari QuickWatch ke jendela Watch, pilih Tambahkan Pengamatan.

  7. Pilih Tutup untuk menutup jendela QuickWatch. (QuickWatch adalah dialog modal, sehingga Anda tidak dapat melanjutkan penelusuran kesalahan selama QuickWatch terbuka.)

  8. Lanjutkan penelusuran kesalahan. Anda dapat mengamati variabel di jendela Watch.