Bagikan melalui


Gunakan jenis titik henti yang tepat

Artikel ini menjelaskan cara menggunakan berbagai jenis breakpoint di Visual Studio untuk meningkatkan efisiensi debugging. Ini mencakup berbagai skenario di mana titik henti dapat diterapkan, seperti menjeda eksekusi kode, informasi pengelogan, dan melacak perubahan dalam status variabel. Artikel ini menjelaskan cara mengatur titik henti kondisional, titik pelacakan, titik henti data, titik henti dependen, dan titik henti sementara. Ini juga mencakup instruksi terperinci tentang pengaturan titik henti fungsi. Panduan ini sangat penting bagi pengembang perangkat lunak yang ingin memanfaatkan titik henti untuk penelusuran kesalahan yang lebih efektif di Visual Studio.

Jika Anda tidak terbiasa menggunakan titik henti di Visual Studio, lihat Mulai menggunakan titik henti sebelum melalui artikel ini.

Untuk pengalaman terbaik dengan dokumentasi ini, pilih bahasa pengembangan atau runtime pilihan Anda dari daftar di bagian atas artikel.

Skenario

Tabel berikut memperlihatkan skenario pemecahan masalah umum untuk breakpoint dan jenis breakpoint yang direkomendasikan untuk skenario tersebut.

Skenario Deskripsi
Bagaimana cara menjeda menjalankan kode untuk memeriksa baris kode yang mungkin berisi bug? Atur titik henti. Untuk informasi selengkapnya, lihat Memulai dengan titik henti.
Apakah variabel saya memiliki nilai yang tidak terduga? Atau, apakah saya ingin memeriksa aplikasi saya saat mencapai status tertentu? Coba titik henti kondisional untuk mengontrol di mana dan kapan titik henti diaktifkan dengan menggunakan logika kondisional. Klik kanan pada titik henti untuk menambahkan kondisi. Atur kondisi menjadi benar ketika variabel sama dengan nilai yang tidak terduga. Untuk informasi selengkapnya, lihat kondisi Titik Henti .
Bagaimana cara mencatat informasi ke jendela Output dalam kondisi yang dapat dikonfigurasi tanpa memodifikasi atau menghentikan kode saya? Tracepoints memungkinkan Anda untuk mencatat informasi ke jendela Output dalam kondisi yang dapat dikonfigurasi tanpa memodifikasi atau menghentikan kode Anda. Untuk informasi selengkapnya, lihat Menggunakan titik pelacakan di debugger Visual Studio.
Bagaimana cara mengetahui kapan nilai variabel saya berubah? Untuk C++, atur titik henti data .
Untuk aplikasi yang menggunakan .NET Core 3 dan yang lebih baru, Anda juga dapat mengatur titik henti data .
Jika tidak, hanya untuk C# dan F#, Anda dapat melacak ID objek dengan titik henti bersyarat.
Bagaimana cara memutuskan eksekusi hanya jika titik henti lainnya terpicu? Atur Titik Henti Dependen yang menghentikan eksekusi hanya jika titik henti lain dicapai lebih dulu. Untuk informasi selengkapnya, lihat Titik Henti Dependen .
Bisakah saya mencapai titik henti hanya sekali? Atur titik henti sementara yang memungkinkan Anda memecahkan kode hanya sekali. Untuk informasi selengkapnya, lihat Titik Henti Sementara .
Dapatkah saya menjeda kode di dalam perulangan pada iterasi tertentu? Atur titik henti Dependen yang memutus eksekusi hanya jika titik henti lain pertama kali ditemui. Untuk informasi selengkapnya, lihat jumlah hit .
Dapatkah saya menjeda kode di awal fungsi saat saya mengetahui nama fungsi tetapi bukan lokasinya? Anda dapat melakukan ini dengan titik henti fungsi. Untuk informasi selengkapnya, lihat Mengatur titik henti fungsi.
Dapatkah saya menjeda kode di awal beberapa fungsi dengan nama yang sama? Ketika Anda memiliki beberapa fungsi dengan nama yang sama (fungsi atau fungsi yang kelebihan beban dalam proyek yang berbeda), Anda dapat menggunakan titik henti fungsi .

Tindakan titik henti dan titik jejak

Titik pelacakan adalah titik henti yang mencetak pesan ke jendela Output. Tracepoint dapat bertindak seperti pernyataan jejak sementara dalam bahasa pemrograman dan tidak menghentikan sementara eksekusi kode. Anda membuat titik pelacakan dengan mengatur tindakan khusus di jendela Pengaturan Titik Henti. Untuk instruksi terperinci, lihat Menggunakan titik pelacakan di debugger Visual Studio.

Kondisi titik henti

Anda dapat mengontrol kapan dan di mana titik henti dijalankan dengan mengatur kondisi. Kondisi dapat berupa ekspresi valid apa pun yang dikenali oleh debugger. (Untuk informasi selengkapnya tentang ekspresi yang valid, lihat Ekspresi di debugger.)

Untuk mengatur kondisi titik henti:

  1. Klik kanan simbol titik henti dan pilih Kondisi (atau tekan Alt + F9, C). Atau arahkan mouse ke simbol titik henti, pilih ikon Pengaturan, lalu pilih Kondisi di jendela Pengaturan Titik Henti.

    Anda juga dapat mengeklik kanan di margin paling kiri di sebelah baris kode dan memilih Masukkan Titik Henti Kondisional dari menu konteks untuk mengatur titik henti kondisional baru.

    Anda juga dapat mengatur ketentuan di jendela Titik Henti dengan mengeklik kanan titik henti dan memilih Pengaturan, lalu memilih Kondisi

    Pengaturan titik henti

    Pengaturan titik henti

  2. Di drop-down, pilih Ekspresi Kondisional, Hit Count, atau Filter, dan tetapkan nilainya.

  3. Pilih Tutup atau tekan Ctrl+Enter untuk menutup jendela Pengaturan Titik Henti. Atau, dari jendela Titik Henti, pilih OK untuk menutup dialog.

Titik henti dengan kondisi yang diatur muncul dengan simbol + di kode sumber dan jendela Titik Henti.

Membuat ungkapan bersyarat

Saat Anda memilih Ungkapan bersyarat, Anda dapat memilih di antara dua ketentuan: Benar atau Saat diubah. Pilih Benar untuk menghentikan saat ekspresi terpenuhi, atau Saat diubah untuk memutuskan saat nilai ekspresi telah berubah.

Dalam contoh berikut, titik henti hanya terjadi bila nilai testInt adalah 4:

Kondisi titik henti benar

Kondisi titik henti benar

Dalam contoh berikut, titik henti hanya terjadi ketika nilai testInt berubah:

Titik Henti Ketika diubah

Titik Henti Ketika diubah

Jika Anda mengatur kondisi titik henti dengan sintaksis yang tidak valid, pesan peringatan akan muncul. Jika Anda menentukan kondisi titik henti dengan sintaksis yang valid tetapi semantik yang tidak valid, pesan peringatan akan muncul saat titik henti pertama kali ditemui. Dalam kedua kasus tersebut, debugger akan rusak saat mencapai titik henti yang tidak valid. Titik henti dilewati hanya jika kondisinya valid dan bernilai false.

Catatan

Untuk bidang Saat diubah, debugger tidak menganggap evaluasi pertama dari kondisi sebagai perubahan, jadi tidak mencapai titik henti pada evaluasi pertama.

Gunakan ID Objek dalam ungkapan bersyarat (khusus C# dan F#)

Ada kalanya Anda ingin mengamati perilaku suatu objek tertentu. Misalnya, Anda mungkin ingin mencari tahu mengapa suatu objek dimasukkan ke dalam koleksi lebih dari sekali. Di C# dan F#, Anda dapat membuat ID objek untuk instans tertentu dari jenis referensi, dan menggunakannya dalam kondisi titik henti. ID objek dihasilkan oleh layanan penelusuran kesalahan runtime bahasa umum (CLR) dan terkait dengan objek.

Untuk membuat ID Objek:

  1. Atur titik henti dalam kode di suatu tempat setelah objek dibuat.

  2. Mulai penelusuran kesalahan, dan saat eksekusi berhenti di titik henti, pilih Debug>Windows>Lokal (atau tekan Ctrl + Alt + V, L) untuk membuka jendela Lokal.

    Temukan contoh objek tertentu di jendela Lokal, klik kanan, dan pilih Buat ID Objek.

    Anda akan melihat $ angka plus di jendela Locals. Ini adalah ID objek.

  3. Tambahkan titik henti baru pada titik yang ingin Anda selidiki; misalnya, ketika objek akan ditambahkan ke koleksi. Klik kanan titik henti dan pilih Kondisi.

  4. Gunakan ID Objek di bidang Ungkapan Bersyarat. Misalnya, jika variabel item adalah objek yang akan ditambahkan ke koleksi, pilih Benar dan ketik item == $<n>, di mana <n> adalah nomor ID objek.

    Eksekusi akan rusak pada titik ketika objek itu akan ditambahkan ke koleksi.

    Untuk menghapus ID Objek, klik kanan variabel di jendela Lokal dan pilih Hapus ID Objek.

Catatan

ID objek membuat referensi yang lemah, dan tidak mencegah objek dari pengumpulan sampah. Mereka hanya valid untuk sesi penelusuran kesalahan saat ini.

Tetapkan kondisi hitungan

Jika Anda menduga bahwa perulangan dalam kode Anda mulai berperilaku tidak semestinya setelah sejumlah iterasi tertentu, Anda dapat menyetel titik henti untuk menghentikan eksekusi setelah jumlah klik tersebut, daripada harus berulang kali menekan F5 untuk mencapai iterasi itu.

Di bawah Kondisi di jendela Pengaturan Titik Henti, pilih Hit Count, lalu tentukan jumlah iterasi. Dalam contoh berikut, titik henti diatur untuk mencapai setiap iterasi lainnya:

Jumlah hit titik henti

Jumlah hit titik henti

Mengatur kondisi filter

Anda dapat membatasi titik henti untuk diaktifkan hanya pada perangkat tertentu, atau dalam proses dan utas tertentu.

Di bawah Kondisi di jendela Pengaturan Titik Henti, pilih Filter, lalu masukkan satu atau beberapa ekspresi berikut:

  • MachineName = "name"
  • ProcessId = nilai
  • ProcessName = "name"
  • ThreadId = value
  • ThreadName = "name"

Sertakan nilai string dalam tanda kutip ganda. Anda dapat menggabungkan klausa menggunakan & (AND), || (OR), ! (NOT), dan tanda kurung.

Mengatur titik henti fungsi

Anda dapat menghentikan eksekusi ketika suatu fungsi dipanggil. Ini berguna, misalnya, ketika Anda mengetahui nama fungsi tetapi tidak mengetahui lokasinya. Ini juga berguna jika Anda memiliki fungsi dengan nama yang sama dan Anda ingin memecah semuanya (seperti fungsi yang kelebihan beban atau fungsi dalam proyek yang berbeda).

Untuk mengatur titik henti fungsi:

  1. Pilih Debug>Titik Henti Baru>Fungsi Titik Henti, atau tekan Ctrl + K, B.

    Anda juga dapat memilih Baru>Fungsi Titik Henti di jendela Titik Henti.

  2. Dalam dialog Fungsi Titik Henti Baru, masukkan nama fungsi di kotak Fungsi Nama.

    Untuk mempersempit spesifikasi fungsi:

    • Gunakan nama fungsi yang sepenuhnya memenuhi syarat.

      Contoh: Namespace1.ClassX.MethodA()

    • Tambahkan jenis parameter dari fungsi yang kelebihan beban.

      Contoh: MethodA(int, string)

    • Menggunakan '!' simbol untuk menentukan modul.

      Contoh: App1.dll!MethodA

    • Gunakan operator konteks di C++ asli.

      {function, , [module]} [+<line offset from start of method>]

      Contoh: {MethodA, , App1.dll}+2

  3. Di dropdown Bahasa, pilih bahasa fungsi.

  4. Pilih OK.

Mengatur titik henti fungsi menggunakan alamat memori (khusus C++ asli)

Anda dapat menggunakan alamat suatu objek untuk mengatur titik henti fungsi pada metode yang dipanggil oleh instans kelas tertentu. Misalnya, dengan objek beralamat jenis my_class, Anda dapat mengatur titik henti fungsi pada metode my_method yang dipanggil instans.

  1. Atur titik henti di suatu tempat setelah instans kelas dipakai.

  2. Temukan alamat instans (misalnya, 0xcccccccc).

  3. Pilih Debug>Titik Henti Baru>Fungsi Titik Henti, atau tekan Ctrl + K, B.

  4. Tambahkan yang berikut ini ke kotak Nama Fungsi, dan pilih bahasa komputer C++.

    ((my_class *) 0xcccccccc)->my_method
    

Mengatur titik henti data (.NET Core 3.x atau .NET 5+)

Titik henti data memutuskan eksekusi saat properti objek tertentu berubah.

Untuk mengatur titik henti data:

  1. Dalam proyek .NET Core atau .NET 5+, mulai penelusuran kesalahan, dan tunggu hingga titik henti tercapai.

  2. Di jendela Otomatis, Watch, atau Lokal, klik kanan properti dan pilih Hentikan saat nilai berubah di menu konteks.

    Titik Henti Data Terkelola

Titik henti data untuk .NET Core dan .NET 5+ tidak akan berfungsi untuk:

  • Properti yang tidak dapat diperluas di tooltip, Lokal, Otomatis, atau Jendela pengawasan
  • Variabel statis
  • Kelas dengan Atribut DebuggerTypeProxy
  • Bidang di dalam struktur

Untuk jumlah maksimum yang dapat Anda atur, lihat Batas perangkat keras titik henti data.

Mengatur titik henti data (hanya C++ asli)

Titik henti data menghentikan eksekusi ketika nilai yang disimpan pada alamat memori tertentu berubah. Jika nilainya dibaca tetapi tidak diubah, eksekusi tidak rusak.

Untuk mengatur titik henti data:

  1. Dalam proyek C++, mulai penelusuran kesalahan, dan tunggu sampai titik henti tercapai. Pada menu Debug, pilih Titik Henti Baru>Titik Henti Data.

    Anda juga dapat memilih Baru>Titik Henti Data di jendela Titik Henti atau mengeklik kanan item di Otomatis, Watch, atau Lokal dan pilih Hentikan ketika nilai berubah di menu konteks.

  2. Di kotak Alamat, ketik alamat memori, atau ekspresi yang mengevaluasi ke alamat memori. Misalnya, ketik &avar untuk menghentikan saat konten variabel avar berubah.

  3. Di dropdown Jumlah Byte, pilih jumlah byte yang Anda inginkan untuk ditonton oleh debugger. Misalnya, jika Anda memilih 4, debugger akan melihat empat byte mulai dari &avar dan berhenti jika salah satu byte tersebut mengubah nilai.

Titik henti sementara data tidak berfungsi dalam kondisi berikut:

  • Proses yang tidak sedang didebug menulis ke lokasi memori.
  • Lokasi memori dibagi antara dua atau lebih proses.
  • Lokasi memori diperbarui di dalam kernel. Misalnya, jika memori diteruskan ke fungsi ReadFile Windows 32-bit, memori akan diperbarui dari mode kernel, sehingga debugger tidak akan rusak saat pembaruan.
  • Di mana ekspresi jam lebih besar dari 4 byte pada perangkat keras 32-bit dan 8 byte pada perangkat keras 64-bit. Ini adalah batasan arsitektur x86.

Catatan

  • Titik henti data bergantung pada alamat memori tertentu. Alamat variabel berubah dari satu sesi penelusuran kesalahan ke sesi berikutnya, sehingga titik henti sementara data secara otomatis dinonaktifkan di akhir setiap sesi penelusuran kesalahan.

  • Jika Anda mengatur titik henti data pada variabel lokal, titik henti tetap diaktifkan saat fungsi berakhir, tetapi alamat memori tidak lagi berlaku, sehingga perilaku titik henti tidak dapat diprediksi. Jika Anda menetapkan titik henti data pada variabel lokal, Anda harus menghapus atau menonaktifkan titik henti sebelum fungsi berakhir.

Batas perangkat keras titik henti data

Kernel Windows dan perangkat keras yang mendasar memiliki batas berikut saat mengatur titik henti data. Batas mengacu pada jumlah maksimum titik henti data yang dapat Anda atur.

Arsitektur prosesor Batas titik henti data
x64 dan x86 4
ARM64 2
ARM 1

Mengatur titik henti dependen

Titik henti dependen menghentikan eksekusi hanya jika titik henti lain pertama kali terkena. Jadi, dalam skenario kompleks seperti penelusuran kesalahan aplikasi multi-utas, Anda dapat mengonfigurasi titik henti tambahan setelah titik henti lain pertama kali terkena. Ini dapat membuat kode penelusuran kesalahan di jalur umum seperti loop game atau API utilitas jauh lebih mudah karena titik henti dalam fungsi tersebut dapat dikonfigurasi untuk diaktifkan hanya jika fungsi dipanggil dari bagian tertentu aplikasi Anda.

Untuk mengatur titik henti dependen:

  1. Arahkan mouse ke simbol titik henti, pilih ikon Pengaturan, lalu pilih Hanya aktifkan saat titik henti berikut tercapai di jendela Pengaturan Titik Henti.

  2. Di dropdown, pilih titik henti prasyarat yang Anda inginkan untuk menjadi titik henti sementara Anda saat ini.

Pilih Tutup atau tekan Ctrl+Enter untuk menutup jendela Pengaturan Titik Henti. Atau, dari jendela Titik Henti, pilih OK untuk menutup dialog. Titik Henti Dependen

Anda juga dapat menggunakan menu konteks klik kanan untuk mengatur titik henti dependen.

  1. Klik kanan di margin paling kiri di sebelah baris kode dan pilih Masukkan Titik Henti Dependen dari menu konteks.

    Konteks Dependentbreakpoint

  • Titik henti dependen tidak berfungsi jika hanya ada satu titik henti di aplikasi Anda.
  • Titik henti dependen dikonversi ke titik henti garis normal jika titik henti prasyarat dihapus.

Mengatur titik henti sementara

Titik henti ini memungkinkan Anda memecahkan kode hanya sekali. Saat penelusuran kesalahan, debugger Visual Studio hanya menjeda aplikasi yang sedang berjalan sekali untuk titik henti ini dan kemudian menghapusnya segera setelah terkena.

Untuk mengatur titik henti sementara:

  1. Arahkan mouse ke simbol titik henti sementara, pilih ikon Pengaturan, lalu pilih Hapus titik henti sementara setelah terkena di jendela Pengaturan Titik Henti.

  2. Pilih Tutup atau tekan Ctrl+Enter untuk menutup jendela Pengaturan Titik Henti. Atau, dari jendela Titik Henti, pilih OK untuk menutup dialog.

    Titik henti sementara

Anda juga dapat menggunakan menu konteks klik kanan untuk mengatur titik henti sementara.

  1. Klik kanan di margin paling kiri di sebelah baris kode dan pilih Masukkan Titik Henti Sementara dari menu konteks.

    Konteks titik henti sementara

Atau, cukup gunakan pintasan F9 + Shift + Alt, T dan atur titik henti sementara pada baris yang diinginkan.