Bagikan melalui


Titik henti ikatan

Jika pengguna mengatur titik henti, mungkin dengan menekan F9, IDE merumuskan permintaan dan meminta sesi debug untuk membuat titik henti.

Menetapkan titik henti

Mengatur titik henti adalah proses dua langkah, karena kode atau data yang terpengaruh oleh titik henti mungkin belum tersedia. Pertama, titik henti harus dijelaskan, lalu, saat kode atau data tersedia, titik henti harus terikat ke kode atau data tersebut, sebagai berikut:

  1. Titik henti diminta dari mesin debug (DEs) yang relevan, lalu titik henti terikat ke kode atau data saat tersedia.

  2. Permintaan titik henti dikirim ke sesi debug, yang mengirimkannya ke semua DEs yang relevan. De apa pun yang memilih untuk menangani titik henti membuat titik henti tertunda yang sesuai.

  3. Sesi debug mengumpulkan titik henti yang tertunda dan mengirimkannya kembali ke paket debug (komponen penelusuran kesalahan Visual Studio).

  4. Paket debug meminta sesi debug untuk mengikat titik henti yang tertunda ke kode atau data. Sesi debug mengirimkan permintaan ini ke semua DEs yang relevan.

  5. Jika DE dapat mengikat titik henti, DE akan mengirim peristiwa terikat titik henti kembali ke sesi debug. Jika tidak, ini mengirimkan peristiwa kesalahan titik henti sebagai gantinya.

Titik henti tertunda

Titik henti yang tertunda dapat mengikat ke beberapa lokasi kode. Misalnya, baris kode sumber untuk templat C++ dapat mengikat ke setiap urutan kode yang dihasilkan dari templat. Sesi debug dapat menggunakan peristiwa terikat titik henti untuk menghitung konteks kode yang terikat ke titik henti pada saat peristiwa dikirim. Konteks kode lainnya dapat diikat nanti, sehingga DE dapat mengirim beberapa peristiwa terikat titik henti untuk setiap permintaan ikatan. Namun, DE hanya boleh mengirim satu peristiwa kesalahan titik henti per permintaan ikatan.

implementasi

Secara terprogram, paket debug memanggil manajer debug sesi (SDM) dan memberinya antarmuka IDebugBreakpointRequest2 yang membungkus struktur BP_REQUEST_INFO , yang menjelaskan titik henti yang akan diatur. Meskipun titik henti dapat dari banyak bentuk, titik henti pada akhirnya diselesaikan ke konteks kode atau data.

SDM meneruskan panggilan ini ke setiap DE yang relevan dengan memanggil metode CreatePendingBreakpoint-nya. Jika DE memilih untuk menangani titik henti, DE akan membuat dan mengembalikan antarmuka IDebugPendingBreakpoint2 . SDM mengumpulkan antarmuka ini dan meneruskannya kembali ke paket debug sebagai antarmuka tunggal IDebugPendingBreakpoint2 .

Sejauh ini, tidak ada peristiwa yang dihasilkan.

Paket debug kemudian mencoba mengikat titik henti yang tertunda ke kode atau data dengan memanggil Bind, yang diimplementasikan oleh DE.

Jika titik henti terikat, DE mengirimkan antarmuka peristiwa IDebugBreakpointBoundEvent2 ke paket debug. Paket debug menggunakan antarmuka ini untuk menghitung semua konteks kode (atau konteks data tunggal) yang terikat ke titik henti dengan memanggil EnumBoundBreakpoints, yang mengembalikan satu atau beberapa antarmuka IDebugBoundBreakpoint2 . Antarmuka GetBreakpointResolution mengembalikan antarmuka IDebugBreakpointResolution2 , dan GetResolutionInfo mengembalikan penyatuan BP_RESOLUTION_INFO yang berisi kode atau konteks data.

Jika DE tidak dapat mengikat titik henti, DE mengirimkan satu antarmuka peristiwa IDebugBreakpointErrorEvent2 ke paket debug. Paket debug mengambil jenis kesalahan (kesalahan atau peringatan) dan pesan informasi dengan memanggil GetErrorBreakpoint, diikuti oleh GetBreakpointResolution dan GetResolutionInfo. Ini mengembalikan struktur BP_ERROR_RESOLUTION_INFO yang berisi jenis kesalahan dan pesan.

Jika DE menangani titik henti tetapi tidak dapat mengikatnya, de akan mengembalikan kesalahan jenis BPET_TYPE_ERROR. Paket debug merespons dengan menampilkan kotak dialog kesalahan, dan IDE menempatkan tanda seru di dalam glyph titik henti di sebelah kiri baris kode sumber.

Jika DE menangani titik henti, tidak dapat mengikatnya, tetapi beberapa DE lain mungkin mengikatnya, de akan mengembalikan peringatan. IDE merespons dengan menempatkan glyph pertanyaan di dalam glyph titik henti di sebelah kiri baris kode sumber.