Hasilkan kode sumber dari assembly .NET saat debugging
Saat Anda men-debug aplikasi .NET, Anda mungkin menemukan bahwa Anda ingin melihat kode sumber yang tidak Anda miliki. Misalnya, melanggar pengecualian atau menggunakan tumpukan panggilan untuk menavigasi ke lokasi sumber.
Nota
- Pembuatan kode sumber (dekompilasi) hanya tersedia untuk aplikasi .NET dan didasarkan pada proyek ILSpy sumber terbuka.
- Dekomprelasi hanya tersedia di Visual Studio 2019 16.5 dan yang lebih baru.
- Menerapkan atribut SuppressIldasmAttribute pada rakitan atau modul dapat mencegah Visual Studio dari mencoba melakukan dekompilasi. Meskipun atribut usang di .NET 6 dan yang lebih baru, Visual Studio menghormati atribut .
Hasilkan kode sumber
Saat Anda melakukan debug dan tidak ada kode sumber yang tersedia, Visual Studio menampilkan dokumen Sumber Tidak Ditemukan, atau jika Anda tidak memiliki simbol untuk rakitan, dokumen Simbol Tidak Dimuat. Kedua dokumen memiliki opsi dekompilasi kode sumber yang menghasilkan kode C# untuk lokasi saat ini. Kode C# yang dihasilkan kemudian dapat digunakan sama seperti kode sumber lainnya. Anda dapat melihat kode, memeriksa variabel, mengatur titik henti, dan sebagainya.
Tidak ada simbol yang dimuat
Ilustrasi berikut menunjukkan pesan Tanpa Simbol Dimuat.
Sumber tidak ditemukan
Ilustrasi berikut menunjukkan pesan Sumber Tidak Ditemukan.
Kode autodecompile
Mulai visual Studio 2022 versi 17.7, Visual Studio Debugger mendukung kompilasi otomatis kode .NET eksternal. Anda dapat melakukan autodekompilasi saat melangkah ke kode eksternal atau saat menggunakan jendela Call Stack.
Jika Anda melangkah ke kode yang telah diimplementasikan secara eksternal, debugger secara otomatis mendekompilasinya dan menampilkan titik eksekusi saat ini. Jika Anda ingin masuk ke kode eksternal, nonaktifkan Just My Code.
Anda dapat mendekompilasi dari jendela Call Stack tanpa menonaktifkan Just My Code.
Untuk melakukan autodecompile dari jendela Call Stack:
Saat melakukan debugging dengan jendela Call Stack terbuka, pilih Tampilkan Kode Eksternal.
Di jendela Tumpukan Panggilan, klik dua kali bingkai tumpukan apa pun. Debugger mendekompilasi kode, lalu menavigasi langsung ke titik eksekusi saat ini.
Semua kode yang didekompilasi juga ditampilkan di bawah simpul Sumber Eksternal di Penjelajah Solusi, memudahkan untuk menelusuri file eksternal jika diperlukan.
Anda dapat men-debug kode yang didekompilasi dan mengatur titik henti.
Untuk menonaktifkan dekompilasi otomatis kode eksternal, buka Alat > Opsi > Penelusuran Kesalahan > Umum dan batalkan pilihan Dekompilasi secara otomatis ke sumber saat diperlukan (hanya terkelola).
Membuat dan menyematkan sumber untuk perakitan
Selain menghasilkan kode sumber untuk lokasi tertentu, Anda dapat menghasilkan semua kode sumber untuk rakitan .NET tertentu. Untuk melakukan tugas ini, buka jendela Modul dan dari menu konteks rakitan .NET, lalu pilih perintah Dekompilasi Sumber ke File Simbol. Visual Studio menghasilkan file simbol untuk rakitan lalu menyematkan sumber ke dalam file simbol. Pada langkah berikutnya, Anda dapat mengekstrak kode sumber yang disematkan.
Mengekstrak dan melihat kode sumber yang disematkan
Anda dapat mengekstrak file sumber yang disematkan dalam file simbol menggunakan perintah Ekstrak Kode Sumber di menu konteks jendela Modul.
File sumber yang diekstrak ditambahkan ke solusi sebagai file misc. Fitur file lain-lain nonaktif secara default di Visual Studio. Anda dapat mengaktifkan fitur ini dari Alat>Opsi>Lingkungan>Dokumen>Tampilkan file lainnya di Penjelajah Solusi kotak centang. Jika fitur ini tidak diaktifkan, Anda tidak dapat membuka kode sumber yang diekstrak.
File sumber yang diekstrak muncul di file lain-lain di Penjelajah Solusi.
SourceLink
Untuk pustaka .NET atau paket NuGet yang telah diaktifkan untuk SourceLink, Anda juga dapat menelusuri kode sumber, mengatur breakpoint, dan menggunakan semua fitur debugger. Untuk informasi selengkapnya, lihat Mengaktifkan penelusuran kesalahan dan diagnostik dengan SourceLink dan Meningkatkan produktivitas waktu debug dengan SourceLink.
Batasan yang diketahui
Memerlukan mode istirahat
Menghasilkan kode sumber menggunakan dekompilasi hanya dimungkinkan ketika debugger dalam mode istirahat dan aplikasi dijeda. Misalnya, Visual Studio memasuki mode pemutusan saat mencapai titik henti atau pengecualian. Anda dapat dengan mudah memicu Visual Studio untuk berhenti pada saat berikutnya kode Anda dijalankan dengan menggunakan perintah Break All (ikon).
Batasan dekompresi
Menghasilkan kode sumber dari format menengah (IL) yang digunakan dalam rakitan .NET memiliki beberapa batasan yang melekat. Dengan demikian, kode sumber yang dihasilkan tidak terlihat seperti kode sumber asli. Sebagian besar perbedaan ada di tempat di mana informasi dalam kode sumber asli tidak diperlukan pada runtime. Misalnya, informasi seperti spasi kosong, komentar, dan nama variabel lokal tidak diperlukan saat runtime. Kami menyarankan agar Anda menggunakan sumber yang dihasilkan untuk memahami bagaimana program dijalankan dan bukan sebagai pengganti kode sumber asli.
Debug rakitan yang dioptimalkan atau rilis
Saat men-debug kode yang didekompilasi dari rakitan yang dikompilasi dengan menggunakan pengoptimalan kompilator, Anda mungkin menemukan masalah berikut:
- Titik henti mungkin tidak selalu terhubung ke lokasi sumber yang sesuai.
- Melangkah mungkin tidak selalu sampai ke lokasi yang benar.
- Variabel lokal mungkin tidak memiliki nama yang akurat.
- Beberapa variabel mungkin tidak tersedia untuk evaluasi.
Detail lebih lengkap dapat ditemukan dalam isu GitHub: integrasi ICSharpCode.Decompiler ke VS Debugger.
Keandalan dekompresi
Persentase upaya dekompresi yang relatif kecil dapat mengakibatkan kegagalan. Perilaku ini disebabkan oleh kesalahan referensi null pada urutan titik di ILSpy. Kami telah mengurangi kegagalan dengan menangkap masalah ini dan dengan anggun gagal dalam upaya dekompilasi.
Detail lebih lanjut dapat ditemukan dalam masalah GitHub: integrasi ICSharpCode.Decompiler ke VS Debugger.
Batasan dengan kode asinkron
Hasil dari mendekompilasi modul dengan pola kode asinkron/menunggu dapat tidak lengkap atau gagal sepenuhnya. Implementasi ILSpy dari async/await dan yield pada mesin status hanya diimplementasikan sebagian.
Detail selengkapnya dapat ditemukan dalam masalah GitHub: Status Generator PDB.
Hanya Kode Saya
Pengaturan Just My Code (JMC) memungkinkan Visual Studio untuk melewati panggilan sistem, kerangka kerja, pustaka, serta panggilan nonpengguna lainnya. Selama sesi debugging, jendela Modul menunjukkan modul kode mana yang diperlakukan debugger sebagai Kode Saya (kode pengguna).
Dekompilasi modul yang dioptimalkan atau rilis menghasilkan kode yang bukan untuk pengguna. Jika debugger berhenti pada kode nonpengguna yang telah didekompilasi, misalnya, jendela dengan pesan Tidak Ada Sumber akan muncul. Untuk menonaktifkan Just My Code, navigasikan ke Tools>Options (atau Debug>Options) >Debugging>General, lalu batalkan pilihan Aktifkan Just My Code.
Sumber yang diekstrak
Kode sumber yang diekstrak dari rakitan memiliki batasan berikut:
- Nama dan lokasi file yang dihasilkan tidak dapat dikonfigurasi.
- File bersifat sementara dan dihapus oleh Visual Studio.
- File-file ditempatkan dalam satu folder dan hierarki folder dari sumber asli tidak digunakan.
- Nama setiap file berisi hash checksum dari file.
Kode yang dihasilkan hanya C#
Dekompilasi hanya menghasilkan file kode sumber di C#. Tidak ada opsi untuk menghasilkan file dalam bahasa lain.