Aracılığıyla paylaş


Ayrıntılı derleme yükleme bilgilerini toplama

.NET 5'den başlayarak çalışma zamanı, derleme yükleme sorunlarını tanılamaya yardımcı olmak için yönetilen derleme yükleme hakkında ayrıntılı bilgilerle olayları EventPipe yayabilir. Bu olaylar sağlayıcı tarafından Microsoft-Windows-DotNETRuntime ()0x4 anahtar sözcüğü altında AssemblyLoader yayılır.

Önkoşullar

Not

Özelliklerin dotnet-trace kapsamı, ayrıntılı derleme yükleme bilgilerini toplamaktan daha büyüktür. kullanımı hakkında daha fazla bilgi için dotnet-tracebkz dotnet-trace. .

Derleme yükleme olaylarıyla izleme toplama

Mevcut bir işlemi izlemek veya bir alt işlemi başlatmak ve başlangıçtan izlemek için kullanabilirsiniz dotnet-trace .

Mevcut bir işlemi izleme

Derleme yükleme olaylarını çalışma zamanında etkinleştirmek ve bunların bir izlemesini toplamak için aşağıdaki komutla kullanın dotnet-trace :

dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id <pid>

Bu komut, belirtilen <pid>öğesinin bir izlemesini toplar ve AssemblyLoader sağlayıcıdaki Microsoft-Windows-DotNETRuntime olayları etkinleştirir. Sonuç bir .nettrace dosyadır.

Bir alt işlemi başlatmak ve başlangıçtan izlemek için dotnet-trace kullanma

Bazen başlangıçtan bir işlemin izlemesini toplamak yararlı olabilir. .NET 5 veya üzerini çalıştıran uygulamalar için bunu kullanabilirsiniz dotnet-trace .

Aşağıdaki komut, komut satırı bağımsız değişkenleri olarak ve arg2 ile arg1 hello.exe başlatır ve çalışma zamanı başlangıcından bir izleme toplar:

dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 -- hello.exe arg1 arg2

Enter veya Ctrl + C tuşlarına basarak izlemeyi toplamayı durdurabilirsiniz. Bu, hello.exe de kapatır.

Not

  • hello.exe'yi dotnet-trace başlatmak giriş ve çıkışını yeniden yönlendirir ve varsayılan olarak konsolda onunla etkileşim kuramazsınız. --show-child-io ve stdoutile stdin etkileşime geçmek için anahtarını kullanın.
  • Ctrl+C SIGTERM veya güvenli bir şekilde hem aracı hem de alt işlemi sonlandırarak araç çıkılır.
  • Alt işlem araçdan önce çıkarsa, araç da çıkar ve izleme güvenli bir şekilde görüntülenebilir olmalıdır.

İzlemeyi görüntüleme

Toplanan izleme dosyası, PerfView'daki Olaylar görünümü kullanılarak Windows'da görüntülenebilir. Tüm derleme yükleme olaylarının ön eki Microsoft-Windows-DotNETRuntime/AssemblyLoaderolur.

Örnek (Windows'ta)

Bu örnekte derleme yükleme uzantısı noktaları örneği kullanılmaktadır. Uygulama, uygulama tarafından başvurulmayan ve bu nedenle bir derleme MyLibrary yükleme uzantısı noktasında işlemenin başarıyla yüklenmesini gerektiren bir derleme olan bir derlemeyi yüklemeyi dener.

İzlemeyi toplama

  1. İndirilen örneği içeren dizine gidin. Uygulamayı şu şekilde derleyin:

    dotnet build
    
  2. Uygulamayı duraklatılması gerektiğini belirten bağımsız değişkenlerle başlatın ve tuşa basılması bekleniyor. Devam ettirilmesi sırasında, derlemeyi başarılı bir yük için gerekli işleme olmadan varsayılan olarak AssemblyLoadContext yüklemeyi dener. Çıkış dizinine gidin ve şu komutu çalıştırın:

    AssemblyLoading.exe /d default
    
  3. Uygulamanın işlem kimliğini bulun.

    dotnet-trace ps
    

    Çıkışta kullanılabilir işlemler listelenecektir. Örneğin:

    35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exe
    
  4. Çalışan uygulamaya ekleyin dotnet-trace .

    dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
    
  5. Uygulamayı çalıştıran pencerede, programın devam etmesine izin vermek için herhangi bir tuşa basın. Uygulama çıktıktan sonra izleme otomatik olarak durur.

İzlemeyi görüntüleme

Toplanan izlemeyi PerfView'da açın ve Olaylar görünümünü açın. Olaylar listesini olaylara göre Microsoft-Windows-DotNETRuntime/AssemblyLoader filtreleyin.

PerfView assembly loader filter image

İzleme başlatıldıktan sonra uygulamada oluşan tüm derleme yükleri gösterilir. Bu örnekte MyLibraryilgilendiğimiz derlemenin yükleme işlemini incelemek için biraz daha filtreleme yapabiliriz.

Montaj yükleri

Soldaki olay listesini kullanarak altındaki ve Stop olaylarına Microsoft-Windows-DotNETRuntime/AssemblyLoader göre görünümü Start filtreleyin. , ActivityIDve Success sütunlarını AssemblyNamegörünüme ekleyin. içeren olaylara göre filtreleyin MyLibrary.

PerfView Start and Stop events image

Olay Adı Assemblyname ActivityID Başarılı
AssemblyLoader/Start MyLibrary, Culture=neutral, PublicKeyToken=null 1/2/
AssemblyLoader/Stop MyLibrary, Culture=neutral, PublicKeyToken=null 1/2/ False

Olayda, yükleme işleminin Stop başarısız olduğunu gösteren ile Success=False birStop Start/çift görmeniz gerekir. İki olayın aynı etkinlik kimliğine sahip olduğunu unutmayın. Etkinlik kimliği, diğer tüm bütünleştirilmiş kod yükleyici olaylarını yalnızca bu yükleme işlemine karşılık gelen olaylara göre filtrelemek için kullanılabilir.

Yükleme girişiminin dökümü

Yükleme işleminin daha ayrıntılı bir dökümü içinResolutionAttempted, soldaki olay listesini kullanarak altındaki olaylara Microsoft-Windows-DotNETRuntime/AssemblyLoader göre görünümü filtreleyin. , Stageve Result sütunlarını AssemblyNamegörünüme ekleyin. Çiftin etkinlik kimliğine sahip olaylara filtreleyin Start/Stop .

PerfView ResolutionAttempted events image

Olay Adı Assemblyname Aşama Sonuç
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null FindInLoadContext AssemblyNotFound
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null ApplicationAssemblies AssemblyNotFound
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null AssemblyLoadContextResolvingEvent AssemblyNotFound
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null AppDomainAssemblyResolveEvent AssemblyNotFound

Yukarıdaki olaylar, derleme yükleyicisinin geçerli yük bağlamını arayarak, yönetilen uygulama derlemeleri için varsayılan yoklama mantığını çalıştırarak, olay için işleyicileri çağırarak ve işleyicilerini çağırarak derlemeyi AssemblyLoadContext.Resolving AppDomain.AssemblyResolveçözümlemeye çalıştığını gösterir. Bu adımların tümü için derleme bulunamadı.

Uzantı noktaları

Hangi uzantı noktalarının çağrıldığı görmek için, soldaki olay listesini kullanarak görünümü AssemblyLoadContextResolvingHandlerInvoked ve AppDomainAssemblyResolveHandlerInvoked altına Microsoft-Windows-DotNETRuntime/AssemblyLoader filtreleyin. ve HandlerName sütunlarını AssemblyName görünüme ekleyin. Çiftin etkinlik kimliğine sahip olaylara filtreleyin Start/Stop .

PerfView extension point events image

Olay Adı Assemblyname HandlerName
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked MyLibrary, Culture=neutral, PublicKeyToken=null OnAssemblyLoadContextResolving
AssemblyLoader/AppDomainAssemblyResolveHandlerInvoked MyLibrary, Culture=neutral, PublicKeyToken=null OnAppDomainAssemblyResolve

Yukarıdaki olaylar, adlı OnAssemblyLoadContextResolving bir işleyicinin olay için çağrıldığı ve adlı bir işleyicinin AssemblyLoadContext.Resolving OnAppDomainAssemblyResolve AppDomain.AssemblyResolve olay için çağrıldığını gösterir.

Başka bir izleme toplama

Uygulamayı, olay işleyicisinin AssemblyLoadContext.Resolving derlemeyi yükleyeceği MyLibrary şekilde bağımsız değişkenlerle çalıştırın.

AssemblyLoading /d default alc-resolving

Yukarıdaki adımları kullanarak başka bir .nettrace dosya toplayın ve açın.

ve olaylarını Start yeniden filtreleyinMyLibrary.Stop Aralarında başkaStop Start/bir Start/Stop çift görmeniz gerekir. İç yük işlemi, işleyici AssemblyLoadContext.Resolving tarafından çağrıldığında AssemblyLoadContext.LoadFromAssemblyPathtetiklenen yükü temsil eder. Bu kez, olayda yük işleminin Stop başarılı olduğunu belirten öğesini görmeniz Success=True gerekir. ResultAssemblyPath alanında, sonuçta elde edilen derlemenin yolu gösterilir.

PerfView successful Start and Stop events image

Olay Adı Assemblyname ActivityID Başarılı ResultAssemblyPath
AssemblyLoader/Start MyLibrary, Culture=neutral, PublicKeyToken=null 1/2/
AssemblyLoader/Start MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 1/2/1/
AssemblyLoader/Stop MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 1/2/1/ True C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll
AssemblyLoader/Stop MyLibrary, Culture=neutral, PublicKeyToken=null 1/2/ True C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll

Ardından, derlemenin ResolutionAttempted başarıyla çözümlendiği adımı belirlemek için dış yükten etkinlik kimliğine sahip olaylara bakabiliriz. Bu kez olaylar aşamanın AssemblyLoadContextResolvingEvent başarılı olduğunu gösterecektir. ResultAssemblyPath alanında, sonuçta elde edilen derlemenin yolu gösterilir.

PerfView successful ResolutionAttempted events image

Olay Adı Assemblyname Aşama Sonuç ResultAssemblyPath
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null FindInLoadContext AssemblyNotFound
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null ApplicationAssemblies AssemblyNotFound
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null AssemblyLoadContextResolvingEvent Success C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll

Olaylara baktığımızda AssemblyLoadContextResolvingHandlerInvoked adlı OnAssemblyLoadContextResolving işleyicinin çağrıldığı gösterilir. alanı, ResultAssemblyPath işleyici tarafından döndürülen derlemenin yolunu gösterir.

PerfView successful extension point events image

Olay Adı Assemblyname HandlerName ResultAssemblyPath
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked MyLibrary, Culture=neutral, PublicKeyToken=null OnAssemblyLoadContextResolving C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll

Derleme, olayı tetikleyen AppDomain.AssemblyResolve yükleme algoritmasının adımına AppDomainAssemblyResolveEvent ulaşmadan önce başarıyla yüklendiğinden, artık aşamaya veya herhangi bir ResolutionAttempted olaya sahip bir AppDomainAssemblyResolveHandlerInvoked olay olmadığını unutmayın.

Ayrıca bkz.