.NET'te görüntü hatalarını ayıklamayı kolaylaştırma

Not

Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.

Yönetilmeyen kod derlerken, IDE anahtarları veya komut satırı seçeneklerini ayarlayarak hata ayıklama için yürütülebilir görüntü yapılandırabilirsiniz. Örneğin, Visual C++ içindeki /Zi komut satırı seçeneğini kullanarak hata ayıklama sembol dosyalarını (.pdb dosya uzantısı) yaymalarını isteyebilirsiniz. Benzer şekilde, /Od komut satırı seçeneği derleyiciye iyileştirmeyi devre dışı bırakmasını söyler. Sonuçta elde edilen kod daha yavaş çalışır, ancak bu gerekli olduğunda hata ayıklaması daha kolaydır.

.NET Framework yönetilen kodu derlenirken Visual C++, Visual Basic ve C# gibi derleyiciler kaynak programlarını ortak ara dilde (CIL) derler. CIL, yerel makine kodunda yürütülmeden hemen önce JIT ile derlenmiş olur. Yönetilmeyen kodda olduğu gibi, IDE anahtarları veya komut satırı seçeneklerini ayarlayarak hata ayıklama için yürütülebilir bir görüntü yapılandırabilirsiniz. Hata ayıklama için JIT derlemesini de aynı şekilde yapılandırabilirsiniz.

Bu JIT yapılandırmasının iki yönü vardır:

  • JIT derleyicisinin izleme bilgileri oluşturmasını isteyebilirsiniz. Bu, hata ayıklayıcının CIL zincirini makine koduna karşılık gelen zincirle eşleştirmesini ve yerel değişkenlerin ve işlev bağımsız değişkenlerinin nerede depolandığını izlemesini mümkün kılar. .NET Framework sürüm 2.0 ve sonraki sürümlerde JIT derleyicisi her zaman izleme bilgileri oluşturur, bu nedenle istemeye gerek yoktur.

  • JIT derleyicisinin sonuçta elde edilen makine kodunu iyileştirmemesi için istekte bulunabilirsiniz.

Normalde, CIL'yi oluşturan derleyici, belirttiğiniz IDE anahtarları veya komut satırı seçeneklerine (örneğin, /Od) bağlı olarak bu JIT derleyici seçeneklerini uygun şekilde ayarlar.

Bazı durumlarda, oluşturduğu makine kodunun hata ayıklamasını kolaylaştırmak için JIT derleyicisinin davranışını değiştirmek isteyebilirsiniz. Örneğin, perakende derlemesi veya denetim iyileştirmesi için JIT izleme bilgileri oluşturmak isteyebilirsiniz. Bunu bir başlatma (.ini) dosyasıyla yapabilirsiniz.

Örneğin, hata ayıklamak istediğiniz derleme MyApp.exe olarak adlandırılırsa, MyApp.exe ile aynı klasörde şu üç satırı içeren MyApp.ini adlı bir metin dosyası oluşturabilirsiniz:

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

Her seçeneğin değerini 0 veya 1 olarak ayarlayabilirsiniz ve olmayan seçenekler varsayılan olarak 0'dır. 1 ve AllowOptimize 0 olarak ayarlamak GenerateTrackingInfo en kolay hata ayıklamayı sağlar.

.NET Framework 2.0'dan başlayarak, JIT derleyicisi her zaman için GenerateTrackingInfodeğerinden bağımsız olarak izleme bilgileri oluşturur; ancak değerin AllowOptimize etkisi devam eder. İyileştirme olmadan yerel görüntüyü önceden derlemek için Ngen.exe (Yerel Görüntü Oluşturucu) kullanıldığında, Ngen.exe yürütürken .ini dosyası ile AllowOptimize=0 hedef klasörde bulunmalıdır. İyileştirme olmadan bir derlemeyi önceden derlediyseniz, kodu iyileştirilmiş olarak önceden derlemek için Ngen.exe yeniden çalıştırmadan önce NGen.exe /uninstall seçeneğini kullanarak önceden derlenmiş kodu kaldırmanız gerekir. .ini dosyası klasörde yoksa, varsayılan olarak Ngen.exe kodu iyileştirilmiş olarak önceden derler.

bir System.Diagnostics.DebuggableAttribute derlemenin ayarlarını denetler. DebuggableAttribute , JIT derleyicisinin izleme bilgilerini iyileştirmesi ve/veya oluşturması gerekip gerekmediğini denetleen iki alan içerir. .NET Framework 2.0 ve sonraki sürümlerinde JIT derleyicisi her zaman izleme bilgileri oluşturur.

Perakende derlemesi için derleyiciler DebuggableAttribute ayarlamaz. Varsayılan olarak, JIT derleyicisi makine kodunda hata ayıklaması en zor olan en yüksek performansı oluşturur. JIT izlemenin etkinleştirilmesi performansı biraz düşürür ve iyileştirmeyi devre dışı bırakmak performansı çok düşürür.

DebuggableAttribute, derleme içindeki tek tek modüller için değil, bir bütünleştirilmiş kodun tamamına aynı anda uygulanır. Bu nedenle geliştirme araçlarının derleme meta veri belirtecine, bir derleme zaten oluşturulduysa veya System.Runtime.CompilerServices.AssemblyAttributesGoHere adlı sınıfa özel öznitelikler eklemesi gerekir. Ardından ALink aracı bu DebuggableAttribute özniteliklerini her modülden parçası oldukları derlemeye yükseltmektedir. Çakışma olursa, ALink işlemi başarısız olur.

Not

.NET Framework'ün 1.0 sürümünde, /clr ve /Zi derleyici seçenekleri belirtildiğinde Microsoft Visual C++ derleyicisi DebuggableAttribute'u ekler. .NET Framework'ün 1.1 sürümünde, kodunuzda DebuggableAttribute öğesini el ile eklemeniz veya /ASSEMBLYDEBUG bağlayıcısı seçeneğini kullanmanız gerekir.

Ayrıca bkz.