Bagikan melalui


Hasilkan kode sumber dari rakitan .NET saat penelusuran kesalahan

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 menuju ke lokasi sumber.

Catatan

  • Pembuatan kode sumber (dekompilasi) hanya tersedia untuk aplikasi .NET dan berbasiskan proyek ILSpy sumber terbuka.
  • Dekompilasi hanya tersedia di Visual Studio 2019 16.5 dan yang lebih baru.
  • Menerapkan atribut SuppressIldasmAttribute ke rakitan atau modul mencegah Visual Studio melakukan dekompilasi. Meskipun atribut usang di .NET 6 dan yang lebih baru, Visual Studio menghormati atribut .

Membuat kode sumber

Saat Anda melakukan penelusuran kesalahan dan kode sumber tidak tersedia, Visual Studio akan menampilkan dokumen Sumber Tidak Ditemukan, atau jika Anda tidak memiliki simbol untuk rakitan, dokumen Tanpa Simbol Dimuat. Kedua dokumen ini memiliki opsi Dekompilasi kode sumber yang membuat kode C# untuk lokasi saat ini. Kode C# yang dibuat kemudian bisa digunakan seperti kode sumber lainnya. Anda bisa melihat kodenya, memeriksa variabel, mengatur titik henti, dan seterusnya.

Tidak ada simbol yang dimuat

Ilustrasi berikut menunjukkan pesan Tidak ada Simbol yang Dimuat.

Screenshot of no symbol loaded document

Sumber tidak ditemukan

Ilustrasi berikut ini menampilkan pesan Sumber Tidak Ditemukan.

Screenshot of source not found document

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, Just My Code harus dinonaktifkan.

Anda dapat dengan mudah mendekompilasi dari jendela Call Stack tanpa menonaktifkan Just My Code.

Untuk melakukan autodecompile dari jendela Call Stack:

  1. Saat menelusuri kesalahan dengan jendela Tumpukan Panggilan terbuka, pilih Perlihatkan 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.

    Screenshot of Call Stack window showing external code.

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

    Screenshot of External Sources node showing decompiled assemblies.

    Anda dapat men-debug kode yang didekompilasi dan mengatur titik henti.

Untuk menonaktifkan dekompilasi otomatis kode eksternal, buka Opsi Alat Penelusuran Kesalahan > Umum dan batalkan pilihan Dekompilasi otomatis ke sumber saat diperlukan (hanya terkelola).>>

Membuat dan menyematkan sumber untuk rakitan

Selain membuat kode sumber untuk lokasi tertentu, Anda bisa membuat 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 membuat file simbol untuk rakitan lalu menyematkan sumber ke dalam file simbol. Langkah selanjutnya, Anda bisa mengekstrak kode sumber yang disematkan.

Screenshot of assembly context menu in modules window with decompile source command.

Mengekstrak dan menampilkan kode sumber yang disematkan

Anda bisa mengekstrak file sumber yang disematkan dalam file simbol dengan perintah Ekstrak Kode Sumber di menu pintasan jendela Modul.

Screenshot of assembly context menu in modules window with extract sources command.

File sumber yang diekstrak ditambahkan ke solusi sebagai file miscellaneous. Fitur file miscellaneous nonaktif secara default di Visual Studio. Anda bisa mengaktifkan fitur ini dari kotak centangAlat>Opsi>Lingkungan>Dokumen>Perlihatkan File Miscellaneous di Penjelajah Solusi. Jika fitur ini tidak diaktifkan, Anda tidak dapat membuka kode sumber yang diekstrak.

Screenshot of tools option page with miscellaneous files option enabled.

File sumber yang diekstrak muncul dalam file miscellaneous di Penjelajah Solusi.

Screenshot of solution explorer with miscellaneous files.

Untuk pustaka .NET atau paket NuGet yang diaktifkan di SourceLink, Anda juga bisa melakukan step kode sumber, mengatur titik henti, dan menggunakan semua fitur debugger. Untuk informasi selengkapnya, lihat Mengaktifkan penelusuran kesalahan dan diagnostik dengan Tautan Sumber dan Meningkatkan produktivitas waktu debug dengan SourceLink.

Pembatasan yang diketahui

Perlu mode berhenti

Membuat kode sumber melalui dekompilasi hanya memungkinkan ketika debugger berada dalam mode berhenti dan aplikasi dijeda. Misalnya, Visual Studio memasuki mode berhenti saat mencapai titik henti atau pengecualian. Anda dapat dengan mudah memicu Visual Studio untuk menghentikan waktu berikutnya kode Anda berjalan dengan menggunakan perintah Hentian Semua (Break all icon).

Batasan dekompilasi

Membuat kode sumber dari format menengah (IL) yang digunakan dalam rakitan .NET memiliki beberapa batasan bawaan. Dengan demikian, kode sumber yang dibuat tidak terlihat seperti kode sumber asli. Kebanyakan perbedaannya ada di tempat dimana informasi dalam kode sumber asli tidak diperlukan saat runtime. Misalnya, informasi seperti ruang kosong, komentar, dan nama variabel lokal tidak diperlukan saat runtime. Kami sarankan agar Anda menggunakan sumber yang telah dibuat untuk memahami bagaimana program dijalankan dan bukan sebagai pengganti kode sumber asli.

Rakitan yang dioptimalkan debug atau rakitan 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 mengikat ke lokasi sumber yang cocok.
  • Melangkah mungkin tidak selalu melangkah ke lokasi yang benar.
  • Variabel lokal mungkin tidak memiliki nama yang akurat.
  • Beberapa variabel mungkin tidak tersedia untuk evaluasi.

Detail selengkapnya bisa ditemukan dalam masalah GitHub: Integrasi ICSharpCode.Decompiler vs Debugger.

Keandalan dekompilasi

Persentase upaya dekompresi yang relatif kecil dapat mengakibatkan kegagalan. Perilaku ini disebabkan oleh kesalahan referensi null titik urutan di ILSpy. Kami berupaya mengurangi kegagalan dengan mengetahui masalah dan dengan tenang menggagalkan upaya dekompilasi.

Detail selengkapnya bisa ditemukan dalam masalah GitHub: Integrasi ICSharpCode.Decompiler vs Debugger.

Keterbatasan dengan kode asinkron

Hasil dari mendekompilasi modul dengan pola kode asinkron/menunggu dapat tidak lengkap atau gagal sepenuhnya. Implementasi ILSpy dari komputer asinkron/menunggu dan komputer mode penangguhan hanya diimplementasikan sebagian.

Detail selengkapnya bisa ditemukan dalam masalah GitHub: Status Generator PDB.

Hanya Kode Saya

Pengaturan Just My Code (JMC) memungkinkan Visual Studio untuk melangkahi sistem, kerangka kerja, pustaka, dan panggilan nonpengguna lainnya. Selama sesi penelusuran kesalahan, jendela Modul menampilkan modul kode mana yang diperlakukan debugger sebagai Kode Saya (kode pengguna).

Dekompilasi modul yang dioptimalkan atau rilis menghasilkan kode nonpengguna. Jika debugger diputuskan dalam kode nonpengguna yang didekompilasi, misalnya, jendela Tidak Ada Sumber muncul. Untuk menonaktifkan Hanya Kode Saya, buka Alat>Opsi (atau Debug>Opsi) >Debugging>Umum, lalu batalkan pilihan Aktifkan Hanya Kode Saya.

Sumber yang diekstrak

Kode sumber yang diekstrak dari rakitan memiliki batasan berikut:

  • Nama dan lokasi file yang dibuat tidak dapat dikonfigurasi.
  • File bersifat sementara dan dihapus oleh Visual Studio.
  • File ditempatkan dalam satu folder dan hierarki folder lain yang sumber aslinya tidak digunakan.
  • Nama file untuk setiap file berisi hash checksum file.

Kode yang dibuat hanya C# saja

Dekompilasi hanya membuat file kode sumber dalam C#. Tidak ada opsi untuk menghasilkan file dalam bahasa lain.