Bagikan melalui


Mendiagnosis Kesalahan dengan Asisten Debugging Terkelola

Nota

Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.

Asisten debugging terkelola (MDA) adalah alat bantu debugging yang bekerja dengan Common Language Runtime (CLR) untuk memberikan informasi tentang status runtime. Asisten menghasilkan pesan informasi tentang peristiwa runtime yang tidak dapat Anda jebak. Anda dapat menggunakan MDA untuk mengisolasi bug aplikasi yang sulit ditemukan yang terjadi saat transisi antara kode terkelola dan tidak terkelola.

Anda dapat mengaktifkan atau menonaktifkan semua MDA dengan menambahkan kunci ke registri Windows atau dengan mengatur variabel lingkungan. Anda dapat mengaktifkan MDA tertentu dengan menggunakan pengaturan konfigurasi aplikasi. Anda dapat mengatur pengaturan konfigurasi tambahan untuk beberapa MDA individual dalam file konfigurasi aplikasi. Karena file konfigurasi ini diurai ketika runtime dimuat, Anda harus mengaktifkan MDA sebelum aplikasi terkelola dimulai. Anda tidak dapat mengaktifkannya untuk aplikasi yang telah dimulai.

Tabel berikut mencantumkan MDA yang dikirim dengan .NET Framework:

MDA
asinkronThreadAbort
kegagalan pengikatan
callbackOnCollectedDelegate
contextSwitchDeadlock
dangerousThreadingAPI
dateTimeInvalidLocalFormat
dirtyCastAndCallOnInterface
konteksTerputus
dllMainReturnsFalse
pengecualian tertelan pada panggilan dari Com
failedQI
fatalExecutionEngineError
gcManagedToUnmanaged
gcUnmanagedToManaged
illegalPrepareConstrainedRegion
PerubahanStatusApartemenTidakValid
PanggilanCERYangTidakValid
invalidFunctionPointerInDelegate
invalidGCHandleCookie
invalidIUnknown
deklarasiAnggotaTidakValid
invalidOverlappedToPinvoke
invalidVariant
jitCompilationStart
loaderLock
loadFromContext
marshalCleanupError
pengarahan
memberInfoCacheCreation
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
tumpang tindihFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
Reentri
releaseHandleFailed
reportAvOnComRelease
streamWriterBufferedDataLost
virtualCERCall

Secara default, .NET Framework mengaktifkan subset MDA untuk semua debugger terkelola. Anda dapat melihat set default di Visual Studio dengan memilihPengaturan Pengecualian> pada menu Debug, lalu memperluas daftar Asisten Penelusuran Kesalahan Terkelola.

Jendela Pengaturan Pengecualian di Visual Studio

Mengaktifkan dan Menonaktifkan MDA

Anda dapat mengaktifkan dan menonaktifkan MDA dengan menggunakan kunci registri, variabel lingkungan, dan pengaturan konfigurasi aplikasi. Anda harus mengaktifkan kunci registri atau variabel lingkungan untuk menggunakan pengaturan konfigurasi aplikasi.

Petunjuk / Saran

Alih-alih menonaktifkan MDA, Anda dapat mencegah Visual Studio menampilkan kotak dialog MDA setiap kali pemberitahuan MDA diterima. Untuk melakukannya, pilih Windows>Pengaturan Pengecualian pada menu Debug, perluas daftar Asisten Penelusuran Kesalahan Terkelola, lalu pilih atau kosongkan kotak centang Berhenti Saat Dilempar untuk MDA individual.

Kunci Registri

Untuk mengaktifkan MDA, tambahkan subkuntang HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA (ketik REG_SZ, nilai 1) di registri Windows. Salin contoh berikut ke dalam file teks bernama MDAEnable.reg. Buka Editor Registri Windows (RegEdit.exe), dan dari menu File pilih Impor. Pilih file MDAEnable.reg untuk mengaktifkan MDA di komputer tersebut. Mengatur subkunci ke nilai string 1 (bukan nilai DWORD 1) memungkinkan pembacaan pengaturan MDA dari file ApplicationName.suffix.mda.config. Misalnya, file konfigurasi MDA untuk Notepad akan diberi nama notepad.exe.mda.config.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

Jika komputer menjalankan aplikasi 32-bit pada sistem operasi 64-bit, maka kunci MDA harus diatur seperti berikut:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]
"MDA"="1"

Lihat Pengaturan KonfigurasiApplication-Specific untuk informasi selengkapnya. Pengaturan registri dapat dibatalkan oleh variabel lingkungan COMPLUS_MDA. Lihat Variabel Lingkungan untuk informasi selengkapnya.

Untuk menonaktifkan MDA, atur subkuntah MDA ke 0 (nol) menggunakan Editor Registri Windows.

Secara default, beberapa MDA diaktifkan saat Anda menjalankan aplikasi yang dilampirkan ke debugger, bahkan tanpa menambahkan kunci registri. Anda dapat menonaktifkan asisten ini dengan menjalankan file MDADisable.reg seperti yang dijelaskan sebelumnya di bagian ini.

Variabel lingkungan

Aktivasi MDA juga dapat dikontrol oleh variabel lingkungan COMPLUS_MDA, yang menggantikan kunci registri. String COMPLUS_MDA adalah daftar nama MDA yang tidak peka huruf besar/kecil dan dibatasi titik koma atau string kontrol khusus lainnya. Memulai dalam debugger terkelola atau tidak dikelola mengaktifkan sekumpulan MDA secara default. Ini dilakukan dengan secara implisit menambahkan daftar MDA yang dibatasi titik koma yang diaktifkan secara default di bawah debugger ke nilai variabel lingkungan atau kunci registri. String kontrol khusus adalah sebagai berikut:

  • 0 - Menonaktifkan semua MDA.

  • 1 - Membaca pengaturan MDA dari ApplicationName.mda.config.

  • managedDebugger - Secara eksplisit mengaktifkan semua MDA yang aktif secara implisit saat aplikasi terkelola dijalankan di bawah debugger.

  • unmanagedDebugger - Secara eksplisit mengaktifkan semua MDA yang diaktifkan secara implisit ketika executable yang tidak terkelola dimulai di bawah debugger.

Jika ada pengaturan yang bertentangan, pengaturan terbaru akan menimpa pengaturan sebelumnya:

  • COMPLUS_MDA=0 menonaktifkan semua MDA, termasuk yang diaktifkan secara implisit dalam lingkungan debugging.

  • COMPLUS_MDA=gcUnmanagedToManaged mengaktifkan gcUnmanagedToManaged selain MDA apa pun yang diaktifkan secara implisit di bawah debugger.

  • COMPLUS_MDA=0;gcUnmanagedToManaged mengaktifkan gcUnmanagedToManaged tetapi menonaktifkan MDA yang seharusnya diaktifkan secara implisit di bawah debugger.

Pengaturan Konfigurasi Application-Specific

Anda dapat mengaktifkan, menonaktifkan, dan mengonfigurasi beberapa asisten satu per satu dalam file konfigurasi MDA untuk aplikasi. Untuk mengaktifkan penggunaan file konfigurasi aplikasi untuk mengonfigurasi MDA, kunci registri MDA atau COMPLUS_MDA variabel lingkungan harus diatur. File konfigurasi aplikasi biasanya terletak di direktori yang sama dengan file aplikasi yang dapat dieksekusi (.exe). Nama file mengambil formulir ApplicationName.mda.config; misalnya, notepad.exe.mda.config. Asisten yang diaktifkan dalam file konfigurasi aplikasi mungkin memiliki atribut atau elemen yang dirancang untuk mengontrol perilaku asisten tersebut.

Contoh berikut menunjukkan cara mengaktifkan dan mengonfigurasi marshaling:

<mdaConfig>
  <assistants>
    <marshaling>
      <methodFilter>
        <match name="*"/>
      </methodFilter>
      <fieldFilter>
        <match name="*"/>
      </fieldFilter>
    </marshaling>
  </assistants>
</mdaConfig>

Marshaling MDA memancarkan informasi tentang jenis terkelola yang sedang diubah ke jenis tidak terkelola untuk setiap transisi dari jenis terkelola ke jenis tidak terkelola dalam aplikasi. Marshaling MDA juga dapat memfilter nama bidang metode dan struktur yang disediakan dalam elemen methodFilter dan fieldFilter turunan.

Contoh berikut menunjukkan cara mengaktifkan beberapa MDA dengan menggunakan pengaturan defaultnya:

<mdaConfig>
  <assistants>
    <illegalPrepareConstrainedRegion />
    <invalidCERCall />
    <openGenericCERCall />
    <virtualCERCall />
  </assistants>
</mdaConfig>

Penting

Saat Anda menentukan lebih dari satu asisten dalam file konfigurasi, Anda harus mencantumkannya dalam urutan alfabet. Misalnya, jika Anda ingin mengaktifkan virtualCERCall dan invalidCERCall MDA, Anda harus menambahkan <invalidCERCall /> entri sebelum <virtualCERCall /> entri. Jika entri tidak dalam urutan alfabet, pesan pengecualian file konfigurasi tidak valid yang tidak tertangani ditampilkan.

Pengecualian MDA

Saat MDA diaktifkan, MDA aktif bahkan ketika kode Anda tidak dijalankan di bawah debugger. Jika peristiwa MDA dinaikkan saat debugger tidak ada, pesan peristiwa disajikan dalam kotak dialog pengecualian yang tidak tertangani, meskipun itu bukan pengecualian yang tidak tertangani. Untuk menghindari kotak dialog, hapus pengaturan yang mengaktifkan fitur MDA saat kode Anda tidak dieksekusi dalam lingkungan pemantauan debug.

Saat kode Anda dijalankan di lingkungan pengembangan terintegrasi (IDE) Visual Studio, Anda dapat menghindari kotak dialog pengecualian yang muncul untuk peristiwa MDA tertentu. Untuk melakukannya, pada menu Debug, pilihPengaturan Pengecualian>. Di jendela Pengaturan Pengecualian, perluas daftar Asisten Penelusuran Kesalahan Terkelola, lalu hapus centang pada kotak Berhenti Ketika Dilempar untuk MDA individual. Anda juga bisa menggunakan kotak dialog ini untuk mengaktifkan tampilan kotak dialog pengecualian MDA.

MDA Hasil

Keluaran MDA mirip dengan contoh berikut, yang memperlihatkan keluaran dari PInvokeStackImbalance MDA:

Panggilan ke fungsi PInvoke 'MDATest!MDATest.Program::StdCall' telah menyebabkan tumpukan menjadi tidak seimbang. Ini kemungkinan karena tanda tangan PInvoke terkelola tidak cocok dengan tanda tangan target yang tidak dikelola. Periksa apakah konvensi panggilan dan parameter tanda tangan PInvoke cocok dengan tanda tangan target yang tidak dikelola.

Lihat juga