Debugging di Visual Studio

Breakpoint, jendela Watch, dan stepping untuk melacak perilaku program.

Daftar isi

Debugging adalah proses menghentikan program pada titik tertentu, memeriksa nilai variabelnya, dan melangkah melalui kodenya untuk menemukan penyebab perilaku yang tidak sesuai. Visual Studio menyediakan perangkat tersebut dalam bentuk breakpoint, perintah stepping, dan jendela pengamat nilai. Topik ini membahas cara menggunakan ketiganya pada program VB, menyinggung Edit and Continue secara ringkas, serta menutup dengan jalur pemecahan masalah lewat .NET CLI apabila Visual Studio tidak tersedia.

Menjalankan program dengan debugger#

Debugger Visual Studio aktif ketika program dijalankan dengan perintah Start Debugging atau tombol F5. Program berjalan seperti biasa sampai salah satu breakpoint-nya tercapai, kemudian eksekusinya berhenti dan editor menandai pernyataan berikutnya dengan panah kuning. Keadaan berhenti ini disebut keadaan jeda (break state), dan seluruh jendela inspeksi hanya terisi pada keadaan ini. Menjalankan dengan Ctrl+F5 atau dari terminal hanyalah eksekusi biasa tanpa debugger, sehingga breakpoint tidak berpengaruh apa pun.

Diagram berikut merangkum siklus sesi debugging dari menjalankan program sampai perbaikan diterapkan. Siklus berhenti, memeriksa, dan melangkah ini diulang sampai penyebabnya ditemukan, kemudian kode diperbaiki dan program dijalankan ulang dari awal untuk memastikan perbaikannya.

Siklus sesi debuggingJalankan dengandebugger (F5)Program berhentidi breakpointPeriksa Locals,Watch, atau data tipPerbaiki kode,jalankan ulangStep (F11/F10) atau lanjut (F5)
Siklus sesi debugging dengan breakpoint, inspeksi, dan stepping

Breakpoint dan breakpoint bersyarat#

Breakpoint ditempatkan dengan menekan F9 pada baris kursor atau mengeklik tepi kiri editor, dan ditandai dengan titik merah. Program yang dijalankan dengan debugger berhenti tepat sebelum pernyataan itu dieksekusi. Breakpoint dapat dinonaktifkan sementara tanpa dihapus, sehingga rangkaian titik berhenti dapat diatur ulang antar sesi debugging tanpa mencatatnya kembali.

Breakpoint bersyarat menambahkan ekspresi VB yang harus benar agar program berhenti. Klik kanan titik merah, pilih Conditions, lalu tuliskan ekspresi seperti i = 2 atau nilai > 100. Program hanya berhenti ketika ekspresinya terpenuhi, sehingga iterasi yang tidak relevan dilewati tanpa campur tangan. Bentuk lainnya adalah hit count, yaitu breakpoint yang menghentikan program setelah kejadian tertentu tercapai beberapa kali, misalnya pada hitungan kelipatan sepuluh.

Melangkah dengan Step Into, Step Over, dan Step Out#

Perintah stepping menggerakkan eksekusi langkah demi langkah mulai dari keadaan jeda. Step Into masuk ke dalam prosedur yang dipanggil pada pernyataan berjalan, Step Over menjalankan pemanggilan tersebut sampai selesai tanpa masuk, dan Step Out menyelesaikan prosedur yang sedang berjalan lalu kembali ke pemanggilnya. Tombol Continue melanjutkan eksekusi sampai breakpoint berikutnya.

PerintahTombol bawaanPerilaku pada pernyataan berjalan
Step IntoF11Masuk ke dalam prosedur yang dipanggil
Step OverF10Menjalankan prosedur sampai selesai tanpa masuk
Step OutShift+F11Menyelesaikan prosedur berjalan lalu kembali ke pemanggil
ContinueF5Berjalan sampai breakpoint berikutnya

Pilihan di antara perintah-perintah itu mengikuti kebutuhan penyelidikan. Masuk ke prosedur yang ingin diperiksa lebih dalam, lewati prosedur pustaka yang perilakunya sudah dipercaya, dan keluar dengan Step Out apabila ternyata masuk ke tempat yang tidak disengaja. Kombinasi ini menjaga sesi debugging tetap fokus pada kode yang sedang diselidiki, bukan pada ribuan baris pustaka di dalamnya.

Jendela Locals, Autos, dan Watch#

Jendela Locals menampilkan setiap variabel lokal pada lingkup saat ini beserta nilainya, sedangkan Autos menampilkan variabel yang digunakan pada pernyataan berjalan dan pernyataan tepat sebelumnya. Keduanya terisi otomatis dan paling cepat untuk melihat keadaan program pada satu titik jeda. Mengarahkan kursor ke variabel pada editor membuka data tip, yaitu kotak kecil yang menampilkan nilainya tanpa perlu membuka jendela tambahan.

Jendela Watch menerima ekspresi yang diketik sendiri, misalnya total \ jumlah atau nilai.Length, lalu menghitungnya ulang setiap kali program berhenti. Daftar ekspresi itu bertahan antar sesi debugging, sehingga cocok untuk nilai yang dipantau berulang kali. Nilai pada Locals maupun Watch juga dapat diganti langsung dari jendelanya, dan program melanjutkan eksekusi dengan nilai pengganti tersebut untuk menguji dugaan tanpa menyunting kode.

Edit and Continue#

Edit and Continue menerima perubahan kecil pada kode saat program berada dalam keadaan jeda. Perbaikan sederhana, misalnya mengganti satu ekspresi, mengubah nilai awal variabel, atau memperbaiki rentang perulangan seperti pada latihan di bawah, dapat ditulis langsung di editor dan dilanjutkan dengan F5 tanpa menghentikan sesi. Cara ini mempercepat verifikasi karena hasil perbaikan terlihat pada eksekusi yang sama, bukan pada sesi baru. Tidak semua perubahan diterima, misalnya menambah prosedur atau mengubah tanda tangan prosedur, dan Visual Studio akan meminta program dijalankan ulang untuk perubahan semacam itu. Daftar perubahan yang didukung untuk VB terdokumentasi pada halaman Edit and Continue yang dicantumkan di Referensi.

Program latihan pelacakan#

Program berikut menghitung rata-rata tiga nilai ujian, tetapi hasilnya salah. Program ini sengaja memuat satu kesalahan sebagai bahan latihan. Jalankan lewat F5 setelah menempatkan breakpoint pada baris total += nilai(i), kemudian amati jendela Locals pada setiap iterasi.

vb LatihanPelacak.vb
Option Strict On

Module Program

    ' Program latihan pelacakan dengan debugger.
    ' Fungsi RataRata sengaja memuat satu kesalahan rentang loop.
    Function RataRata(nilai() As Integer) As Double
        Dim total As Integer = 0
        For i As Integer = 0 To nilai.Length - 2
            total += nilai(i)
        Next
        Return total / nilai.Length
    End Function

    Sub Main()
        Dim nilai() As Integer = {80, 90, 100}
        Dim rata As Double = RataRata(nilai)
        Console.WriteLine($"Dihitung : {rata}")
        Console.WriteLine($"Harusnya : {(80 + 90 + 100) / 3}")
    End Sub
End Module
text Keluaran
Dihitung : 56.666666666666664
Harusnya : 90

Keluaran menampilkan 56.666666666666664 sebagai hasil hitung, sedangkan 90 adalah rata-rata yang benar dari 80, 90, dan 100. Dengan breakpoint pada baris penjumlahan, jendela Locals memperlihatkan total bertambah dari 80 menjadi 170, lalu perulangan berhenti tanpa pernah memproses nilai 100. Penyebabnya ada pada rentang For yang tertulis nilai.Length - 2, sehingga indeks terakhir terlewati. Ubah rentangnya menjadi nilai.Length - 1, jalankan ulang, dan program mencetak 90.

Latihan semacam ini melatih tiga hal sekaligus, yaitu menempatkan breakpoint pada baris yang tepat, membaca perubahan nilai di Locals, dan menautkan temuan tersebut ke baris penyebabnya. Angka pecahan yang panjang seperti 56.666666666666664 adalah representasi normal tipe Double, bukan tanda kerusakan tambahan.

Debugging melalui .NET CLI#

Perintah dotnet run memanggil build secara implisit sebelum eksekusi, sehingga siklus sunting dan uji dapat berlangsung dari terminal saja tanpa menjalankan dotnet build terpisah.

bash
# tidak-dijalankan
# membangun dan menjalankan proyek console pada folder saat ini
dotnet run

Tanpa debugger, pemeriksaan dilakukan dengan instrumentasi sederhana berupa Console.WriteLine yang mencetak nilai variabel pada titik yang ingin diperiksa. Tambahkan pencetakan sementara, jalankan dotnet run, baca keluarannya, lalu hapus pencetakan itu setelah penyebabnya ditemukan. Perintah berikut mengulang siklus tersebut secara otomatis dengan menjalankan ulang program setiap berkas sumber berubah.

bash
# tidak-dijalankan
# menjalankan ulang otomatis setiap berkas sumber berubah
dotnet watch run

Kemampuan debugger untuk berjeda seperti pada Visual Studio tidak tersedia pada CLI polos, sehingga jalur ini mengandalkan keluaran program sebagai sumber pengamatannya. Kelemahan itu diterima karena kepraktisannya, yaitu tidak membutuhkan pemasangan apa pun selain .NET SDK yang memang sudah digunakan untuk menjalankan seluruh contoh pada jalur ini.

Kesalahan umum#

Kesalahan pertama adalah menjalankan program tanpa debugger lalu menyimpulkan breakpointnya rusak. Breakpoint hanya berfungsi pada sesi F5, sedangkan Ctrl+F5 dan dotnet run dari terminal berada di luar debugger. Pastikan sesi debugging aktif sebelum mengubah-ubah titik hentinya.

Kesalahan kedua adalah memeriksa variabel pada baris yang belum dieksekusi. Pernyataan berjalan ditandai panah kuning, dan variabel yang dinyatakan di bawahnya belum memiliki nilai. Melangkah satu perintah lebih dahulu membuat jendela inspeksi menampilkan keadaan yang benar.

Kesalahan ketiga adalah mengubah banyak baris sekaligus saat program berjeda. Perubahan besar sering tidak didukung Edit and Continue sehingga sesi terpaksa dihentikan, dan beberapa perubahan sekaligus menyulitkan penentuan perbaikan mana yang benar-benar menyelesaikan masalah. Terapkan satu perbaikan, jalankan ulang, kemudian lanjutkan ke perbaikan berikutnya.

Ringkasan#

  • Debugger aktif saat program dijalankan dengan F5, program berhenti pada breakpoint, dan seluruh jendela inspeksi terisi pada keadaan jeda tersebut.
  • Step Into, Step Over, dan Step Out menggerakkan eksekusi satu langkah, sedangkan jendela Locals, Autos, dan Watch menampilkan nilai variabel beserta ekspresi yang dipantau.
  • Breakpoint bersyarat membatasi kejadian berhenti pada kondisi tertentu, Edit and Continue menerima perubahan kecil saat berjeda, dan jalur CLI mengandalkan dotnet run beserta instrumentasi Console.WriteLine.

Referensi#