Bagikan melalui


Membuat gambar lebih mudah di-debug di .NET

Nota

Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.

Saat mengompilasi kode yang tidak dikelola, Anda dapat mengonfigurasi file executable untuk debugging dengan mengatur sakelar IDE atau opsi baris perintah. Misalnya, Anda dapat menggunakan opsi baris perintah /Zi di Visual C++ untuk memintanya memancarkan file simbol debug (ekstensi file .pdb). Demikian pula, opsi baris perintah /Od memberi tahu pengkompilasi untuk menonaktifkan pengoptimalan. Kode yang dihasilkan berjalan lebih lambat, tetapi lebih mudah untuk men-debug, jika ini diperlukan.

Saat mengkompilasi kode terkelola .NET Framework, pengkompilasi seperti Visual C++, Visual Basic, dan C# mengkompilasi program sumbernya ke dalam bahasa perantara umum (CIL). CIL kemudian dikompilasi JIT, tepat sebelum eksekusi, ke dalam kode mesin asli. Seperti halnya kode yang tidak dikelola, Anda dapat mengonfigurasi image yang dapat dieksekusi untuk debugging dengan mengatur sakelar pada IDE atau opsi di baris perintah. Anda juga dapat mengonfigurasi kompilasi JIT untuk debugging dengan cara yang serupa.

Konfigurasi JIT ini memiliki dua aspek:

  • Anda dapat meminta pengkompilasi JIT untuk menghasilkan informasi pelacakan. Ini memungkinkan debugger untuk mencocokkan rantai CIL dengan rekan kode mesinnya, dan untuk melacak di mana variabel lokal dan argumen fungsi disimpan. Di .NET Framework versi 2.0 dan yang lebih baru, kompilator JIT selalu menghasilkan informasi pelacakan, sehingga tidak perlu memintanya.

  • Anda dapat meminta pengkompilasi JIT untuk tidak mengoptimalkan kode mesin yang dihasilkan.

Biasanya, pengkompilasi yang menghasilkan CIL mengatur opsi pengkompilasi JIT ini dengan tepat, berdasarkan sakelar IDE atau opsi baris perintah yang Anda tentukan, misalnya, /Od.

Dalam beberapa kasus, Anda mungkin ingin mengubah perilaku pengkompilasi JIT sehingga kode mesin yang dihasilkannya lebih mudah di-debug. Misalnya, Anda mungkin ingin menghasilkan informasi pelacakan JIT untuk pembangunan ritel atau optimalisasi kontrol. Anda dapat melakukannya dengan file inisialisasi (.ini).

Misalnya, jika rakitan yang ingin Anda debug disebut MyApp.exe, maka Anda dapat membuat file teks bernama MyApp.ini, di folder yang sama dengan MyApp.exe, yang berisi tiga baris ini:

[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0

Anda dapat mengatur nilai setiap opsi ke 0 atau 1, dan opsi tidak ada default ke 0. Mengatur GenerateTrackingInfo ke 1 dan AllowOptimize ke 0 memudahkan penelusuran kesalahan.

Dimulai dengan .NET Framework 2.0, pengkompilasi JIT selalu menghasilkan informasi pelacakan terlepas dari nilai untuk GenerateTrackingInfo; namun, nilai AllowOptimize masih memiliki pengaruh. Saat menggunakan Ngen.exe (Native Image Generator) untuk melakukan prakompeksi gambar asli tanpa pengoptimalan, file .ini harus ada di folder target saat AllowOptimize=0 Ngen.exe dijalankan. Jika Anda telah melakukan prakompilasi assembly tanpa pengoptimalan, Anda harus menghapus kode yang telah dikompilasi sebelumnya menggunakan opsi NGen.exe /uninstall sebelum menjalankan ulang Ngen.exe untuk melakukan prakompilasi kode seperti yang dioptimalkan. Jika file .ini tidak ada di folder, secara default Ngen.exe melakukan prakompilasi kode seperti yang dioptimalkan.

System.Diagnostics.DebuggableAttribute mengontrol pengaturan untuk suatu rakitan. DebuggableAttribute mencakup dua bidang yang mengontrol apakah pengkompilasi JIT harus mengoptimalkan dan/atau menghasilkan informasi pelacakan. Di .NET Framework 2.0 dan versi yang lebih baru, kompilator JIT selalu menghasilkan informasi pelacakan.

Untuk build ritel, pengkompilasi tidak mengatur DebuggableAttribute apa pun. Secara default, pengkompilasi JIT menghasilkan performa tertinggi, paling sulit untuk men-debug kode komputer. Mengaktifkan pelacakan JIT sedikit mengurangi performa, sedangkan menonaktifkan pengoptimalan secara signifikan mengurangi performa.

DebuggableAttribute berlaku untuk seluruh perakitan pada satu waktu, bukan untuk modul individual dalam perakitan. Oleh karena itu, alat pengembangan harus melampirkan atribut kustom ke token metadata rakitan, jika rakitan telah dibuat, atau ke kelas yang disebut System.Runtime.CompilerServices.AssemblyAttributesGoHere. Alat ALink kemudian mempromosikan atribut DebuggableAttribute ini dari setiap modul ke assembly yang menjadi bagiannya. Jika ada konflik, operasi ALink gagal.

Nota

Dalam versi 1.0 dari .NET Framework, pengkompilasi Microsoft Visual C++ menambahkan DebuggableAttribute saat opsi pengkompilasi /clr dan /Zi ditentukan. Dalam versi 1.1 dari .NET Framework, Anda harus menambahkan DebuggableAttribute secara manual dalam kode Anda atau menggunakan opsi linker /ASSEMBLYDEBUG .

Lihat juga