Bagikan melalui


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.

Cuplikan layar dokumen yang tidak dimuat simbol

Sumber tidak ditemukan

Ilustrasi berikut menunjukkan pesan Sumber Tidak Ditemukan.

Cuplikan layar sumber tidak ditemukan dokumen

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:

  1. Saat melakukan debugging dengan jendela Call Stack terbuka, pilih Tampilkan Kode Eksternal.

  2. Di jendela Tumpukan Panggilan, klik dua kali bingkai tumpukan apa pun. Debugger mendekompilasi kode, lalu menavigasi langsung ke titik eksekusi saat ini.

    Cuplikan layar jendela Call Stack memperlihatkan kode eksternal.

    Semua kode yang didekompilasi juga ditampilkan di bawah simpul Sumber Eksternal di Penjelajah Solusi, memudahkan untuk menelusuri file eksternal jika diperlukan.

    Cuplikan layar simpul Sumber Eksternal memperlihatkan rakitan yang didekompresi.

    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.

Cuplikan layar menu konteks assembly di jendela modul dengan perintah dekompilasi sumber.

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.

Cuplikan layar menu konteks perakitan di jendela modul dengan perintah ekstrak sumber.

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.

Cuplikan layar halaman opsi alat dengan opsi file lain-lain diaktifkan.

File sumber yang diekstrak muncul di file lain-lain di Penjelajah Solusi.

Cuplikan layar penjelajah solusi dengan file lain-lain.

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 (ikonBreak all).

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.