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
- .NET 5 SDK veya sonraki sürümleri
dotnet-trace
Aracı
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-trace
bkz 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
vestdout
ilestdin
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/AssemblyLoader
olur.
Ö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
İndirilen örneği içeren dizine gidin. Uygulamayı şu şekilde derleyin:
dotnet build
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
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
Çalışan uygulamaya ekleyin
dotnet-trace
.dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
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.
İzleme başlatıldıktan sonra uygulamada oluşan tüm derleme yükleri gösterilir. Bu örnekte MyLibrary
ilgilendiğ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. , ActivityID
ve Success
sütunlarını AssemblyName
görünüme ekleyin. içeren olaylara göre filtreleyin MyLibrary
.
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. , Stage
ve Result
sütunlarını AssemblyName
görünüme ekleyin. Çiftin etkinlik kimliğine sahip olaylara filtreleyin Start
/Stop
.
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
.
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.
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.
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.
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.