Bagikan melalui


Membuat gambar lebih mudah untuk debug di .NET

Catatan

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

Ketika mengompilasi kode tak terkelola, Anda dapat mengonfigurasi gambar yang dapat dieksekusi untuk penelusuran kesalahan dengan mengatur sakelar IDE atau opsi baris perintah. Contohnya, 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 pengompilasi untuk menonaktifkan optimasi. Kode yang dihasilkan berjalan lebih lambat, tetapi lebih mudah untuk melakukan 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 tak terkelola, Anda dapat mengonfigurasi gambar yang dapat dieksekusi untuk penelusuran kesalahan dengan mengatur sakelar IDE atau opsi baris perintah. Anda juga dapat mengonfigurasi kompilasi JIT untuk penelusuran kesalahan dengan cara yang sama.

Konfigurasi JIT ini memiliki dua aspek:

  • Anda dapat meminta pengompilasi JIT untuk menghasilkan informasi penelusuran. 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 pengompilasi JIT untuk tidak mengoptimasi kode komputer 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 pengompilasi JIT sehingga kode komputer yang dihasilkannya lebih mudah untuk dilakukan debug. Contohnya, Anda mungkin ingin menghasilkan informasi penelusuran JIT untuk membangun ritel atau mengoptimasi kontrol. Anda dapat melakukannya dengan file inisialisasi (.ini).

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

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

Anda dapat mengatur nilai setiap opsi menjadi 0 atau 1, dan opsi absen apa pun memiliki default hingga 0. Pengaturan GenerateTrackingInfo menjadi 1 dan AllowOptimize menjadi 0 menyediakan penelusuran kesalahan termudah.

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

System.Diagnostics.DebuggableAttribute mengontrol pengaturan untuk rakitan. DebuggableAttribute mencakup dua kolom yang mengontrol apakah pengompilasi JIT harus mengoptimasi dan/atau menghasilkan informasi penelusuran. Di .NET Framework 2.0 dan versi yang lebih baru, kompilator JIT selalu menghasilkan informasi pelacakan.

Untuk membangun ritel, pengompilasi tidak mengatur DebuggableAttribute. Secara default, pengompilasi JIT menghasilkan performa terbaik, paling sulit untuk melakukan debug komputer. Mengaktifkan penelusuran JIT menurunkan sedikit performa, dan menonaktifkan optimasi sangat menurunkan performa.

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

Catatan

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

Lihat juga