Hata ayıklama sırasında .NET derlemelerinden kaynak kodu oluşturma

Bir .NET uygulamasında hata ayıklarken, sahip olmadığınız kaynak kodunu görüntülemek istediğinizi fark edebilirsiniz. Örneğin, bir özel durumda hata verme veya bir kaynak konuma gitmek için çağrı yığınını kullanma.

Not

  • Kaynak kodu oluşturma (ayrıştırma) yalnızca .NET uygulamalarında kullanılabilir ve ILSpy projesinin açık kaynak temel alır.
  • Derleme yalnızca Visual Studio 2019 16.5 ve sonraki sürümlerde kullanılabilir.
  • SuppressIldasmAttribute özniteliğinin bir derlemeye veya modüle uygulanması, Visual Studio'yu derlemeye çalışmasını engeller. Özniteliği .NET 6 ve sonraki sürümlerde kullanımdan kaldırılmış olsa da, Visual Studio özniteliğini kabul eder.

Kaynak kodu oluşturma

Hata ayıklarken ve kullanılabilir kaynak kodu olmadığında, Visual Studio Kaynak Bulunamadı belgesini gösterir veya derleme için simgeleriniz yoksa, Simge Yüklenmedi belgesini gösterir. Her iki belgede de geçerli konum için C# kodu oluşturan Kaynak kodunu ayrıştır seçeneği vardır. Oluşturulan C# kodu daha sonra diğer kaynak kodlarında olduğu gibi kullanılabilir. Kodu görüntüleyebilir, değişkenleri inceleyebilir, kesme noktaları ayarlayabilir ve benzeri işlemleri yapabilirsiniz.

Hiçbir simge yüklenmedi

Aşağıdaki çizimde , Yüklü Simge Yok iletisi gösterilmektedir.

Screenshot of no symbol loaded document

Kaynak bulunamadı

Aşağıdaki çizimde Kaynak Bulunamadı iletisi gösterilmektedir.

Screenshot of source not found document

Otomatik kod derleme

Visual Studio 2022 sürüm 17.7'den başlayarak, Visual Studio Hata Ayıklayıcısı dış .NET kodunun otomatik olarak derlenmesini destekler. Dış koda adımlarken veya Çağrı Yığını penceresini kullanırken otomatik olarak kod oluşturabilirsiniz.

Harici olarak uygulanan koda adımlarsanız, hata ayıklayıcı kodu otomatik olarak koddan ayırır ve geçerli yürütme noktasını görüntüler. Dış koda geçmek istiyorsanız Yalnızca Benim Kodum devre dışı bırakılmalıdır.

Yalnızca Kodum'u devre dışı bırakmadan Çağrı Yığını penceresinden kolayca kod çözme yapabilirsiniz.

Çağrı Yığını penceresinden otomatik olarak derlemek için:

  1. Çağrı Yığını penceresi açıkken hata ayıklarken Dış Kodu Göster'i seçin.

  2. Çağrı Yığını penceresinde herhangi bir yığın çerçevesine çift tıklayın. Hata ayıklayıcı kodun kodunu bozup doğrudan geçerli yürütme noktasına gider.

    Screenshot of Call Stack window showing external code.

    Derlenen kodun tümü Çözüm Gezgini Dış Kaynaklar düğümü altında da gösterilir. Gerekirse dış dosyalara göz atabilirsiniz.

    Screenshot of External Sources node showing decompiled assemblies.

    Koda dönüştürülmüş kodun hatalarını ayıklayabilir ve kesme noktaları ayarlayabilirsiniz.

Dış kodun otomatik olarak ayrıştırılması özelliğini devre dışı bırakmak için Araçlar Seçenekler > Hata Ayıklama > Genel'e gidin ve Gerektiğinde Kaynağa otomatik olarak kaynak olarak derle (yalnızca yönetilen) seçeneğinin seçimini kaldırın.>

Derleme için kaynak oluşturma ve ekleme

Belirli bir konum için kaynak kodu oluşturmaya ek olarak, belirli bir .NET derlemesi için tüm kaynak kodunu oluşturabilirsiniz. Bu görevi yapmak için Modüller penceresine gidin ve .NET derlemesinin bağlam menüsünden Kaynağı Sembol Dosyasına Koda Ayır komutunu seçin. Visual Studio, derleme için bir sembol dosyası oluşturur ve ardından kaynağı sembol dosyasına ekler. Sonraki bir adımda, eklenmiş kaynak kodunu ayıklayabilirsiniz.

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

Eklenmiş kaynak kodunu ayıklama ve görüntüleme

Modüller penceresinin bağlam menüsündeki Kaynak Kodunu Ayıkla komutunu kullanarak bir sembol dosyasına eklenmiş kaynak dosyaları ayıklayabilirsiniz.

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

Ayıklanan kaynak dosyalar çözüme çeşitli dosyalar olarak eklenir. Visual Studio'da çeşitli dosyalar özelliği varsayılan olarak kapalıdır. Bu özelliği Araçlar>Seçenekleri>Ortam>Belgeleri>Çeşitli dosyaları Çözüm Gezgini göster onay kutusundan etkinleştirebilirsiniz. Bu özellik etkinleştirilmediyse, ayıklanan kaynak kodunu alamazsınız.

Screenshot of tools option page with miscellaneous files option enabled.

Ayıklanan kaynak dosyaları Çözüm Gezgini çeşitli dosyalarda görünür.

Screenshot of solution explorer with miscellaneous files.

.NET kitaplıkları veya SourceLink için etkinleştirilen NuGet paketleri için de kaynak koda adımlayabilir, kesme noktaları ayarlayabilir ve hata ayıklayıcının tüm özelliklerini kullanabilirsiniz. Daha fazla bilgi için bkz . Kaynak Bağlantısı ile hata ayıklamayı ve tanılamayı etkinleştirme ve SourceLink ile hata ayıklama zamanı üretkenliğini iyileştirme.

Bilinen sınırlamalar

Kesme modu gerektirir

Kaynak kodu derleme kullanarak oluşturmak, yalnızca hata ayıklayıcı kesme modundayken ve uygulama duraklatıldığında mümkündür. Örneğin, Visual Studio kesme noktasına veya özel duruma ulaştığında kesme moduna girer. Kodunuzun bir sonraki çalışma zamanı için Tümünü Kes komutunu (Break all icon ) kullanarak Visual Studio'yu kolayca tetikleyebilirsiniz.

Kod çözme sınırlamaları

.NET derlemelerinde kullanılan ara biçimden (IL) kaynak kodu oluşturmanın bazı doğal sınırlamaları vardır. Bu nedenle, oluşturulan kaynak kodu özgün kaynak koduna benzemez. Farklılıkların çoğu özgün kaynak kodundaki bilgilerin çalışma zamanında gerekli olmadığı yerlerdedir. Örneğin, çalışma zamanında boşluk, açıklamalar ve yerel değişkenlerin adları gibi bilgilere ihtiyaç duyulmaz. Oluşturulan kaynağı, özgün kaynak kodunun yerine değil, programın nasıl yürütüldüğünü anlamak için kullanmanızı öneririz.

İyileştirilmiş veya yayın derlemelerinin hatalarını ayıklama

Derleyici iyileştirmeleri kullanılarak derlenen bir derlemeden derlenen kodda hata ayıklarken aşağıdaki sorunlarla karşılaşabilirsiniz:

  • Kesme noktaları her zaman eşleşen kaynak belirleme konumuna bağlanmayabilir.
  • Adımlama her zaman doğru konuma adımlamayabilir.
  • Yerel değişkenlerin adları doğru olmayabilir.
  • Bazı değişkenler değerlendirme için kullanılamayabilir.

GitHub sorununda daha fazla ayrıntı bulunabilir: ICSharpCode.Decompiler ile VS Debugger tümleştirmesi.

Ayrıştırma güvenilirliği

Görece küçük bir derleme denemesi yüzdesi hataya neden olabilir. Bu davranış, ILSpy'daki bir dizi noktası null başvuru hatası nedeniyle oluşur. Bu sorunları yakalayarak ve kod çözme girişimini düzgün bir şekilde başarısız yaparak hatayı azalttık.

GitHub sorununda daha fazla ayrıntı bulunabilir: ICSharpCode.Decompiler ile VS Debugger tümleştirmesi.

Zaman uyumsuz kodla ilgili sınırlamalar

Zaman uyumsuz/await kod desenlerine sahip modüllerin derlenmesi sonucu eksik olabilir veya tamamen başarısız olabilir. Zaman uyumsuz/await ve verim durum makinelerinin ILSpy uygulaması yalnızca kısmen uygulanır.

GitHub sorununda daha fazla ayrıntı bulabilirsiniz: PDB Oluşturucu Durumu.

Yalnızca Kendi Kodum

Just My Code (JMC) ayarı, Visual Studio'nun sistem, çerçeve, kitaplık ve diğer kullanıcı dışı çağrıların üzerine adım atmasını sağlar. Bir hata ayıklama oturumu sırasında Modüller penceresi, hata ayıklayıcının Hangi kod modüllerini Kodum (kullanıcı kodu) olarak ele aldığı gösterir.

İyileştirilmiş veya yayın modüllerinin ayrıştırması, kullanıcı dışı kod oluşturur. Örneğin, hata ayıklayıcı, kullanıcı dışı kodunuzda bozulursa Kaynak Yok penceresi görüntülenir. Yalnızca Benim Kodum'un devre dışı bırakılması için Araçlar>Seçenekler (veya Hata Ayıklama>Seçenekleri)> Hata Ayıklama>Genel'e gidin ve Ardından Yalnızca Kodumu Etkinleştir'in seçimini kaldırın.

Ayıklanan kaynaklar

Bir derlemeden ayıklanan kaynak kodu aşağıdaki sınırlamalara sahiptir:

  • Oluşturulan dosyaların adı ve konumu yapılandırılamaz.
  • Dosyalar geçicidir ve Visual Studio tarafından silinir.
  • Dosyalar tek bir klasöre yerleştirilir ve özgün kaynakların sahip olduğu herhangi bir klasör hiyerarşisi kullanılmaz.
  • Her dosyanın dosya adı, dosyanın sağlama toplamı karması içerir.

Oluşturulan kod yalnızca C#

Ayrıştırma yalnızca C# dilinde kaynak kod dosyaları oluşturur. Başka bir dilde dosya oluşturma seçeneği yoktur.