Bagikan melalui


Men-debug Kode Terkelola Menggunakan Windows Debugger

Anda dapat menggunakan debugger Windows (WinDbg, CDB, dan NTSD) untuk men-debug aplikasi target yang berisi kode terkelola. Untuk men-debug kode terkelola, gunakan ! Ekstensi penelusuran kesalahan SOS (sos.dll) dan komponen akses data (mscordacwks.dll) dalam kombinasi dengan runtime CLR.

Debugger Windows, seperti WinDbg terpisah dari debugger Visual Studio. Untuk informasi tentang perbedaan antara debugger Windows dan debugger Visual Studio, lihat Alat Debugging untuk Windows.

Artikel ini menyediakan instruksi tentang menggunakan debugger Windows (WinDbg, CDB, NTSD) untuk men-debug kode terkelola, termasuk aplikasi .NET Framework, .NET Core, dan .NET 5+.

Catatan

Saat men-debug aplikasi .NET Framework, .NET Core, dan .NET 5+, pastikan Anda menggunakan versi terbaru alat Windows Debugger. Selain itu, pertimbangkan untuk menggunakan Visual Studio atau Visual Studio Code untuk pengalaman penelusuran kesalahan yang lebih terintegrasi. WinDbg lebih kompleks, membutuhkan lebih banyak pekerjaan untuk disiapkan, dan biasanya digunakan ketika informasi tingkat rendah tambahan diperlukan.

Pengantar Kode Terkelola

Kode terkelola dijalankan bersama dengan Microsoft .NET Common Language Runtime (CLR). Dalam aplikasi kode terkelola, kode biner yang dihasilkan kompilator berada di Microsoft Intermediate Language (MSIL), yang independen platform.

Saat kode terkelola dijalankan, runtime menghasilkan kode asli yang khusus untuk platform. Proses pembuatan kode asli dari MSIL disebut kompilasi just-in-time (JIT). Setelah pengkompilasi JIT mengkompilasi MSIL untuk metode tertentu, kode asli metode tetap dalam memori. Setiap kali metode ini kemudian dipanggil, kode asli dijalankan dan pengkompilasi JIT tidak harus terlibat.

Anda dapat membangun kode terkelola dengan menggunakan beberapa kompilator yang diproduksi oleh berbagai produsen perangkat lunak. Secara khusus, Microsoft Visual Studio dapat membangun kode terkelola dari beberapa bahasa yang berbeda termasuk C#, Visual Basic, JScript, dan C++ dengan ekstensi terkelola.

CLR tidak diperbarui setiap kali .NET Framework diperbarui. Misalnya, versi 2.0, 3.0, dan 3.5 dari .NET Framework semuanya menggunakan clr versi 2.0. Untuk informasi tambahan tentang versi .NET, lihat versi dan dependensi .NET Framework. Untuk informasi tentang menentukan versi .NET di PC Anda, lihat Menentukan versi .NET Framework mana yang diinstal.

Men-debug Kode Terkelola

Untuk men-debug kode terkelola menggunakan ! Ekstensi penelusuran kesalahan SOS, debugger harus memuat berbagai komponen. Si! Ekstensi penelusuran kesalahan SOS dan komponen yang diperlukan yang digunakan untuk berbeda untuk .NET Core dan .NET Framework asli. Untuk keduanya, Komponen Akses Data (DAC) (mscordacwks.dll) digunakan.

.NET SDK menyediakan alat yang mungkin berguna dalam bekerja dengan men-debug aplikasi .NET. Untuk informasi selengkapnya, lihat Apa itu .NET SDK?.

.NET Core

Untuk .NET Core ada alat CLI dotnet yang tersedia untuk menginstal sos.dll. Untuk informasi selengkapnya, lihat alat penginstal SOS (dotnet-sos).

.NET Framework asli.

Mendapatkan Ekstensi Penelusuran Kesalahan SOS (sos.dll)

File ekstensi penelusuran kesalahan SOS (sos.dll) tidak disertakan dalam semua versi Alat Debugging untuk Windows. Jika sos.dll tidak tersedia, lihat, Menginstal SOS di Windows.

Memuat Ekstensi Penelusuran Kesalahan SOS (sos.dll)

Untuk men-debug aplikasi .NET Core dan .NET 5+, Anda perlu memuat versi ekstensi penelusuran kesalahan SOS yang sesuai.

Misalnya, ke versi ! SOS yang disertakan dengan debugger dan disertakan dalam jalur pencarian ekstensi saat ini, perintah .load akan digunakan.

0:000> .load sos.dll

Untuk memverifikasi bahwa ekstensi penelusuran kesalahan SOS dimuat dengan benar, gunakan perintah .chain dan periksa rantai DLL Ekstensi.

...
Extension DLL chain:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll: image 4.8.9275.0, API 1.0.0, built Wed Aug 28 14:43:27 2024
        [path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll]
    C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\8.0.8\coreclr.dll: image 8,0,824,36612 @Commit: 08338fcaa5c9b9a8190abb99222fed12aaba956c, built Tue Jul 16 11:10:19 2024
        [path: C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\8.0.8\coreclr.dll]

Jika versi debugger tidak menyertakan sos.dll, Anda mungkin perlu menentukan jalur lengkap ke file SOS.dll. Anda biasanya dapat menemukan file SOS.dll di direktori runtime penginstalan .NET Core atau .NET Framework Anda.

0:000> .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll

Memuat versi sos.dll tertentu

Memuat sos.dll bisa kompleks, karena ada dependensi pada DLL tambahan, yang digunakan oleh sos.dll untuk berkomunikasi dengan .NET. Selain itu, versi DLL yang diperlukan tergantung pada versi .NET aplikasi yang di-debug, dan beberapa versi .NET mungkin ada di komputer.

Salah satu strategi untuk memuat versi DLL dependen yang benar, adalah meminta debugger untuk masuk ketika pemberitahuan clr .NET (CLRN) pertama terjadi menggunakan sx, sxd, sxe, sxi, sxn, sxr, sxr, sx- (Atur Pengecualian)[.. . /debuggercmds/sx--sxd--sxe--sxi--sxn--sxr--sx---set-exceptions-.md] perintah. Setelah Anda melampirkan ke aplikasi .NET target, perintah ini akan digunakan setelah jeda pertama.

0:000> sxe CLRN

Selanjutnya lanjutkan eksekusi dan tunggu hingga jeda terjadi.

0:000> g

Ketika jeda terjadi, nonaktifkan hentian pemberitahuan clr, seperti yang kita tahu clr.dll (atau coreclr.dll) dimuat.

0:000> sxd CLRN

Dengan debugger dalam konteks ini, gunakan .loadby untuk memuat !sos dari lokasi direktori "terdekat" yang sama.

0:000> .loadby sos clr

Opsi lain adalah menggunakan .cordll (Control CLR Debugging) untuk memuat DLL penelusuran kesalahan CLR dengan menyediakan jalur ke lokasi kerangka kerja target.

0:000> .cordll -ve -u -lp C:\Windows\Microsoft.NET\Framework\v4.0.30319\
CLRDLL: Loaded DLL C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll
Automatically loaded SOS Extension
CLR DLL status: Loaded DLL C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll

Menggunakan Ekstensi Penelusuran Kesalahan SOS

Untuk memverifikasi bahwa ekstensi penelusuran kesalahan SOS dimuat dengan benar, masukkan perintah .chain .

0:000> .chain
Extension DLL search Path:
    C:\Program Files\Debugging Tools for Windows (x64);...
Extension DLL chain:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll: image 4.8.9275.0, API 1.0.0, built Wed Aug 28 14:43:27 2024
        [path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll]
...

File simbol .NET

File simbol sangat penting untuk penelusuran kesalahan. Untuk aplikasi .NET Framework, .NET Core, dan .NET 5+, Anda dapat mengambil file simbol yang diperlukan dari server simbol publik Microsoft. Gunakan perintah berikut untuk mengatur jalur simbol dan pemuatan simbol gema.

.symfix

!sym noisy

.reload

Menguji ekstensi .NET Core !sos

Untuk menguji ekstensi penelusuran kesalahan SOS, masukkan !sos.help.

0:000> !sos.help
-------------------------------------------------------------------------------
SOS is a debugger extension DLL designed to aid in the debugging of managed
programs. Functions are listed by category, then roughly in order of
importance. Shortcut names for popular functions are listed in parenthesis.
Type "!help <functionname>" for detailed info on that function. 

Object Inspection                  Examining code and stacks
-----------------------------      -----------------------------
DumpObj (do)                       Threads
DumpArray (da)                     ThreadState
DumpStackObjects (dso)             IP2MD
DumpHeap                           U
DumpVC                             DumpStack
GCRoot                             EEStack
ObjSize                            CLRStack
FinalizeQueue                      GCInfo
PrintException (pe)                EHInfo
TraverseHeap                       BPMD 
                                   COMState

Kemudian coba salah satu perintah yang disediakan oleh ekstensi penelusuran kesalahan SOS. Misalnya, Anda dapat mencoba !sos. DumpDomain atau !sos. Perintah Utas yang disediakan oleh ekstensi debugging .NET Core SOS.

0:000> !sos.DumpDomain
--------------------------------------
System Domain:      7565d980
LowFrequencyHeap:   7565dca4
HighFrequencyHeap:  7565dcf0
StubHeap:           7565dd3c
Stage:              OPEN
Name:               None
--------------------------------------
Shared Domain:      7565d620
LowFrequencyHeap:   7565dca4
HighFrequencyHeap:  7565dcf0
StubHeap:           7565dd3c
Stage:              OPEN
Name:               None
Assembly:           00fa5e78 [C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll]
ClassLoader:        00fa5f40
  Module Name
73571000    C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll

0:000> !sos.Threads
ThreadCount:      2
UnstartedThread:  0
BackgroundThread: 2
PendingThread:    0
DeadThread:       0
Hosted Runtime:   no
                                                                         Lock  
       ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1 4538 00f91110     20220 Preemptive  02FE1238:00000000 00f58be0 1     Ukn 
   7    2 250c 00f9da88     21220 Cooperative 00000000:00000000 00f58be0 1     Ukn (Finalizer) 

Menguji ekstensi .NET Framework !sos

Untuk menguji ekstensi penelusuran kesalahan SOS, masukkan !sos.help. Kemudian coba salah satu perintah yang disediakan oleh ekstensi penelusuran kesalahan SOS. Misalnya, Anda dapat mencoba !sos.sostatus atau perintah !sos.threads .

0:030> !soshelp
crashinfo                                 Displays the crash details that created the dump.
help, soshelp <command>                   Displays help for a command.
loadsymbols <url>                         Loads symbols for all modules.
logclose <path>                           Disables console file logging.
logging <path>                            Enables/disables internal diagnostic logging.
logopen <path>                            Enables console file logging.
maddress                                  Displays a breakdown of the virtual address space.
modules, lm                               Displays the native modules in the process.
registers, r                              Displays the thread's registers.
runtimes <id>                             Lists the runtimes in the target or changes the default runtime.
setclrpath <path>                         Sets the path to load coreclr DAC/DBI files.
setsymbolserver, SetSymbolServer <url>    Enables and sets symbol server support for symbols and module download.
sosflush                                  Resets the internal cached state.
sosstatus                                 Displays internal status.
threads, setthread <thread>               Lists the threads in the target or sets the current thread.

Catatan

Terkadang aplikasi kode terkelola memuat lebih dari satu versi CLR. Dalam hal ini, Anda harus menentukan versi DAC mana yang akan dimuat. Untuk informasi selengkapnya, lihat .cordll dan Clrver.exe (Alat Versi CLR).