MDbg.exe (Debugger Baris Perintah .NET Framework)

NET Framework Command-Line Debugger membantu vendor alat dan pengembang aplikasi menemukan dan memperbaiki bug dalam program yang menargetkan runtime bahasa umum .NET Framework. Alat ini menggunakan API penelusuran kesalahan runtime untuk menyediakan layanan penelusuran kesalahan. Anda dapat menggunakan MDbg.exe untuk men-debug kode yang dikelola saja; tidak ada dukungan untuk men-debug kode yang tidak dikelola.

Alat ini tersedia melalui NuGet. Untuk informasi penginstalan, baca MDbg 0.1.0. Untuk menjalankan alat, gunakan Konsol Manajer Paket. Untuk informasi selengkapnya tentang cara menggunakan Konsol Pengelola Paket, baca artikel Konsol Pengelola Paket.

Pada perintah Manajer Paket, ketik berikut ini:

Sintaks

MDbg [ProgramName[arguments]] [options]

Perintah

Saat Anda berada di debugger (seperti yang ditunjukkan oleh perintah mdbg>), ketikkan salah satu perintah yang dijelaskan di bagian berikutnya:

command [arguments]

Perintah MDbg.exe peka huruf besar-kecil.

Perintah Deskripsi
ap[rocess] [number] Beralih ke proses debug lain atau mencetak proses yang tersedia. Angka-angka tersebut bukanlah ID proses (PID) yang sebenarnya, tetapi daftar yang diindeks 0.
a[ttach] [pid] Melampirkan ke proses atau mencetak proses yang tersedia.
b[reak] [ClassName.Method | FileName:LineNo] Menetapkan titik henti pada metode yang ditentukan. Modul dipindai secara berurutan.

- breakFileName:LineNo mengatur titik henti di lokasi di sumber.
- break~number mengatur titik henti pada simbol yang baru-baru ini ditampilkan dengan perintah x.
- breakmodule!ClassName.Method+IlOffset mengatur titik henti di lokasi yang sangat memenuhi syarat.
block[ingObjects] Menampilkan kunci monitor, yang memblokir utas.
ca[tch] [exceptionType] Menyebabkan debugger rusak pada semua pengecualian, dan tidak hanya pada pengecualian yang tidak ditangani.
cl[earException] Menandai pengecualian saat ini sebagai ditangani sehingga eksekusi dapat dilanjutkan. Jika penyebab pengecualian belum ditangani, pengecualian dapat dengan cepat dimunculkan kembali.
conf[ig] [option value] Menampilkan semua opsi yang dapat dikonfigurasi dan menunjukkan cara opsi dipanggil tanpa nilai opsional apa pun. Jika opsi ditentukan, mengatur value sebagai opsi saat ini. Opsi berikut saat ini tersedia:

- extpath menetapkan jalur untuk menelusuri ekstensi saat perintah load digunakan.
- extpath+ menambahkan jalur untuk memuat ekstensi.
del[ete] Menghapus titik henti.
de[tach] Mencopot dari proses didebug.
d[own] [frames] Memindahkan bingkai tumpukan aktif ke bawah.
echo Menggemakan pesan ke konsol.
enableNotif[ication] typeName 0|1 Mengaktifkan (1) atau menonaktifkan (0) pemberitahuan khusus untuk jenis yang ditentukan.
ex[it] [exitcode] Keluar dari shell MDbg.exe, dan secara opsional menentukan kode keluar proses.
fo[reach] [OtherCommand] Melakukan perintah pada semua utas. OtherCommand adalah perintah valid yang beroperasi pada satu utas; foreachOtherCommand melakukan perintah yang sama pada semua utas.
f[unceval] [-adNum] functionName [args ... ] Melakukan evaluasi fungsi pada utas aktif saat ini tempat fungsi yang dievaluasi adalah functionName. Nama fungsi harus sepenuhnya memenuhi syarat, termasuk ruang nama.

Opsi -ad menentukan domain aplikasi yang akan digunakan untuk menyelesaikan fungsi. Jika opsi -ad tidak ditentukan, domain aplikasi untuk resolusi default ke domain aplikasi tempat utas yang digunakan untuk evaluasi fungsi berada.

Jika fungsi yang sedang dievaluasi tidak statis, parameter pertama yang diteruskan harus berupa penunjuk this. Semua domain aplikasi ditelusuri argumen untuk evaluasi fungsi..

Untuk meminta nilai dari domain aplikasi, awali variabel dengan modul dan nama domain aplikasi; misalnya funceval -ad 0 System.Object.ToString hello.exe#0!MyClass.g_rootRef. Perintah ini mengevaluasi fungsi System.Object.ToString di domain aplikasi 0. Karena metode ToString adalah fungsi instans, parameter pertama harus berupa penunjuk this.
g[o] Menyebabkan program berlanjut hingga menemukan titik henti, program keluar, atau peristiwa (misalnya, pengecualian yang tidak ditangani) menyebabkan program berhenti.
h[elp] [command]

-atau-

? [command]
Menampilkan deskripsi semua perintah atau deskripsi rinci dari perintah tertentu.
ig[nore] [event] Menyebabkan debugger berhenti pada pengecualian yang tidak ditangani saja.
int[ercept] FrameNumber Menggulung debugger balik ke nomor bingkai yang ditentukan.

Jika debugger menemukan pengecualian, gunakan perintah ini untuk mengembalikan debugger ke nomor bingkai yang ditentukan. Anda dapat mengubah status program dengan menggunakan perintah set dan melanjutkan dengan menggunakan perintah go.
k[ill] Menghentikan proses aktif.
l[ist] [modules | appdomains | assemblies] Menampilkan modul, domain aplikasi, atau rakitan yang dimuat.
lo[ad] assemblyName Memuat ekstensi dengan cara berikut: Rakitan yang ditentukan dimuat dan upaya kemudian dilakukan untuk menjalankan metode statis LoadExtension dari jenis Microsoft.Tools.Mdbg.Extension.Extension.
log [eventType] Mengatur atau meampilkan peristiwa yang akan dicatat.
mo[de] [option on/off] Menetapkan opsi debugger yang berbeda. Gunakan mode tanpa opsi untuk mendapatkan daftar mode debug dan pengaturannya saat ini.
mon[itorInfo] monitorReference Menampilkan informasi kunci monitor objek.
newo[bj] typeName [arguments...] Membuat objek baru dengan jenis typeName.
n[ext] Menjalankan kode dan berpindah ke baris berikutnya (bahkan jika baris berikutnya menyertakan banyak panggilan fungsi).
OpendumppathToDumpFile Membuka file cadangan yang ditentukan untuk penelusuran kesalahan.
o[ut] Pindah ke akhir fungsi saat ini.
pa[th] [pathName] Mencari jalur yang ditentukan untuk file sumber jika lokasi di biner tidak tersedia.
p[rint] [var] | [-d] Mencetak semua variabel dalam cakupan (print), mencetak variabel yang ditentukan (printvar), atau mencetak variabel debugger (print-d).
printe[xception] [-r] Mencetak pengecualian terakhir pada utas saat ini. Gunakan opsi –r (rekursif) untuk melintasi properti InnerException pada objek pengecualian untuk mendapatkan informasi tentang seluruh rantai pengecualian.
pro[cessenum] Menampilkan proses yang aktif.
q[uit] [exitcode] Keluar dari shell MDbg.exe, secara opsional menentukan kode keluar proses.
re[sume] [* | [~]threadNumber] Melanjutkan utas saat ini atau utas yang ditentukan oleh parameter threadNumber.

Jika parameter threadNumber ditetapkan sebagai * atau jika nomor utas dimulai dengan ~, perintah berlaku untuk semua utas kecuali yang ditentukan oleh threadNumber.

Melanjutkan utas yang tidak ditangguhkan tidak berpengaruh.
r[un] [-d(ebug) | -o(ptimize) |-enc] [[path_to_exe] [args_to_exe]] Menghentikan proses saat ini (jika ada) dan memulai yang baru. Jika tidak ada argumen yang dapat dieksekusi yang dilewatkan, perintah ini menjalankan program yang sebelumnya dijalankan dengan perintah run. Jika argumen yang dapat dieksekusi disediakan, program yang ditentukan dijalankan menggunakan argumen yang disediakan secara opsional.

Jika pemuatan kelas, pemuatan modul, dan peristiwa awal utas diabaikan (sebagaimana adanya secara default), program berhenti pada instruksi pertama yang dapat dieksekusi dari utas utama.

Anda dapat memaksa debugger untuk mengkompilasi kode just-in-time (JIT) dengan menggunakan salah satu dari tiga tanda berikut:

- -d(ebug) menonaktifkan pengoptimalan. Tanda ini adalah default untuk MDbg.exe.
- -o(ptimize) memaksa kode untuk berjalan lebih seperti di luar debugger, tetapi juga membuat pengalaman debug menjadi lebih sulit. Tanda ini adalah default untuk digunakan di luar debugger.
- -enc memungkinkan fitur Edit dan Lanjutkan tetapi menimbulkan hit performa.
Setvariable=value Mengubah nilai variabel dalam cakupan apa pun.

Anda juga dapat membuat variabel debugger Anda sendiri dan menetapkan nilai referensi ke variabel tersebut dari dalam aplikasi Anda. Nilai-nilai ini bertindak sebagai pengatur ke nilai asli, dan bahkan ketika nilai asli berada di luar cakupan. Semua variabel debugger harus dimulai dengan $ (misalnya, $var). Hapus handel ini dengan mengaturnya ke nol menggunakan perintah berikut:

set $var=
Setip [-il] number Mengatur penunjuk instruksi (IP) saat ini dalam file ke posisi yang ditentukan. Jika Anda menentukan -il opsi , angka mewakili offset bahasa perantara umum (CIL) dalam metode . Jika tidak, nomor tersebut mewakili nomor baris sumber.
sh[ow] [lines] Menentukan jumlah baris yang akan ditampilkan.
s[tep] Memindahkan eksekusi ke fungsi berikutnya pada baris saat ini, atau pindah ke baris berikutnya jika tidak ada fungsi untuk dimasuki.
su[spend] [* | [~]threadNumber] Menangguhkan utas saat ini atau utas yang ditentukan oleh parameter threadNumber. Jika threadNumber ditetapkan sebagai *, perintah tersebut berlaku untuk semua utas. Jika nomor utas dimulai dengan ~, perintah berlaku untuk semua utas kecuali yang ditentukan oleh threadNumber. Utas yang ditangguhkan akan dikecualikan agar tidak berjalan saat proses dijalankan oleh perintah go atau step. Jika tidak ada utas yang tidak ditangguhkan dalam proses dan Anda mengeluarkan perintah go, proses tidak akan dilanjutkan. Dalam hal ini, tekan CTRL-C untuk masuk ke proses.
sy[mbol] commandName [commandValue] Menentukan salah satu dari perintah berikut:

- symbol path ["value"] - Menampilkan atau mengatur jalur simbol saat ini.
- symbol addpath"value" - Menambahkan ke jalur simbol Anda saat ini.
- symbol reload ["module"] - Memuat ulang semua simbol atau simbol untuk modul yang ditentukan.
- symbol list [module] - Menampilkan simbol yang sedang dimuat untuk semua modul atau modul yang ditentukan.
t[hread] [newThread] [-nick nickname] Perintah utas tanpa parameter menampilkan semua utas yang dikelola dalam proses saat ini. Utas biasanya diidentifikasi dengan nomor utasnya; namun, jika utas memiliki nama panggilan yang ditetapkan, nama panggilan tersebut akan ditampilkan sebagai gantinya. Anda dapat menggunakan parameter -nick untuk menetapkan nama panggilan ke utas.

- thread-nickthreadName memberikan nama panggilan ke utas yang sedang berjalan.

Nama panggilan tidak boleh berupa angka. Jika utas saat ini sudah memiliki nama panggilan yang ditetapkan, nama panggilan yang lama diganti dengan yang baru. Jika nama panggilan baru adalah string kosong (""), nama panggilan untuk utas saat ini akan dihapus dan tidak ada nama panggilan baru yang ditetapkan untuk utas tersebut.
u[p] Memindahkan bingkai tumpukan aktif ke atas.
uwgc[handle] [var] | [address] Mencetak variabel yang dilacak oleh pengatur. Pengatur dapat ditentukan berdasarkan nama atau alamat.
when Menampilkan pernyataan when yang sedang aktif.

whendelete all | num [num [num …]] Menghapus pernyataan when yang ditentukan oleh nomor, atau semua pernyataan when jika all ditentukan.

whenstopReason [specific_condition] docmd [cmd [cmd …] ] - Parameter stopReason dapat berupa salah satu dari berikut ini:

StepComplete, , ProcessExited, BreakpointHitThreadCreated, ModuleLoaded, ClassLoadedAssemblyLoaded, , AssemblyUnloaded, ControlCTrapped, ExceptionThrown, UnhandledExceptionThrown, AsyncStop, AttachComplete, , UserBreak, EvalExceptionEvalComplete, RemapOpportunityReached, . NativeStop

specific_condition dapat berupa salah satu dari berikut ini:

- number - Untuk ThreadCreated dan BreakpointHit, memicu tindakan hanya ketika dihentikan oleh nomor thread ID/titik henti dengan nilai yang sama.
- [!]name - Untuk ModuleLoaded, ClassLoaded, AssemblyLoaded, AssemblyUnloaded, ExceptionThrown, dan UnhandledExceptionThrown, memicu tindakan hanya jika nama cocok dengan nama stopReason.

specific_condition harus kosong untuk nilai stopReason lainnya.
w[here] [-v] [-cdepth] [threadID] Menampilkan informasi debug tentang bingkai tumpukan.

- Opsi -v memberikan informasi lengkap tentang setiap bingkai tumpukan yang ditampilkan.
- Menentukan nomor untuk depth membatasi jumlah bingkai yang ditampilkan. Gunakan perintah all untuk menampilkan semua bingkai. Nilai defaultnya adalah 100.
Jika Anda menentukan parameter threadID, Anda dapat mengontrol utas mana yang dikaitkan dengan tumpukan. Standarnya adalah utas saat ini saja. Gunakan perintah all untuk mendapatkan semua utas.
x [-cnumSymbols] [module[!pattern]] Menampilkan fungsi yang cocok dengan pattern untuk sebuah modul.

Jika numSymbos ditentukan, output dibatasi ke nomor yang ditentukan. Jika ! (menunjukkan ekspresi reguler) tidak ditentukan untuk pattern, semua fungsi akan ditampilkan. Jika module tidak tersedia, semua modul yang dimuat akan ditampilkan. Simbol (~#) dapat digunakan untuk mengatur titik henti menggunakan perintah break.

Keterangan

Kompilasikan aplikasi yang akan di-debug menggunakan tanda khusus kompiler yang menyebabkan kompiler Anda menghasilkan simbol penelusuran kesalahan. Baca dokumentasi kompiler Anda untuk informasi lebih lanjut tentang tanda-tanda ini. Anda dapat men-debug aplikasi yang dioptimalkan, tetapi beberapa informasi debug akan hilang. Misalnya, banyak variabel lokal tidak akan terlihat dan baris sumber tidak akurat.

Setelah Anda mengompilasi aplikasi, ketik mdbg pada perintah untuk memulai sesi debug, seperti yang ditunjukkan pada contoh berikut.

C:\Program Files\Microsoft Visual Studio 8\VC>mdbg
MDbg (Managed debugger) v2.0.50727.42 (RTM.050727-4200) started.
Copyright (C) Microsoft Corporation. All rights reserved.

For information about commands type "help";
to exit program type "quit".
mdbg>

Perintah mdbg> menunjukkan bahwa Anda berada di debugger.

Setelah Anda berada di debugger, gunakan perintah dan argumen yang dijelaskan di bagian sebelumnya.

Lihat juga