Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
.NET 5'ten itibaren, çalışma zamanı, derleme yükleme sorunlarını tanılamaya yardımcı olmak için EventPipe aracılığıyla yönetilen derleme yükleme hakkında ayrıntılı bilgiler içeren olayları yayabilir. Bu olaylar, sağlayıcı tarafından Microsoft-Windows-DotNETRuntime anahtar sözcüğü altında AssemblyLoader yayılır.
Önkoşullar
- .NET 5 SDK veya sonraki sürümleri
-
dotnet-tracealet
Uyarı
Özelliklerin dotnet-trace kapsamı, ayrıntılı derleme yükleme bilgileri toplamaktan daha geniştir. kullanımı hakkında daha fazla bilgi için dotnet-tracebkz dotnet-trace. .
Derleme yükleme olayları içeren bir iz elde etme
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 izlemesini toplar ve AssemblyLoader sağlayıcıdaki Microsoft-Windows-DotNETRuntime olaylarını etkinleştirir. Sonuç bir .nettrace dosyadır.
Dotnet-trace ile bir alt işlemi başlatın ve başlangıçtan itibaren izleyin.
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, hello.exe'ı, arg1 ve arg2'yi komut satırı bağımsız değişkenleri olarak 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 aynı zamanda hello.exe'i de kapatır.
Uyarı
-
hello.exe'yi
dotnet-tracebaşlatmak girişi ve çıkışını yeniden yönlendirir ve konsolda varsayılan olarak onunla etkileşim kuramazsınız.--show-child-iovestdinilestdoutetkileşime geçmek için anahtarını kullanın. -
Ctrl+C
SIGTERMtuşlarına basarak hem aracı hem de alt işlemi güvenli bir şekilde sonlandırarak araçtan çıkış yapı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.
İzleri görüntüle
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, kendisi tarafından başvurulmayan bir MyLibrary derlemeyi yüklemeye çalışır - bu derlemenin başarılı bir şekilde yüklenebilmesi için, bir derleme yükleme uzantı noktasında ele alınması gerekir.
İzleri topla
İndirilen örneği içeren dizine gidin. Uygulamayı şu şekilde derleyin:
dotnet buildUygulamayı, duraklaması ve bir tuşa basılmasını beklemesi gerektiğini belirten bağımsız değişkenlerle başlatın. Yeniden başlatıldığında, gerekli işlemleri yapmadan başarılı bir yük için, derlemeyi varsayılan olarak
AssemblyLoadContext'de yüklemeyi dener. Çıkış dizinine gidin ve şu komutu çalıştırın:AssemblyLoading.exe /d defaultUygulamanı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
dotnet-tracebağlayın.dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832Uygulamayı ç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 Microsoft-Windows-DotNETRuntime/AssemblyLoader türündeki olaylara göre filtreleyin.
İ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
Görünümü soldaki olay listesini kullanarak, Start altındaki Stop ve Microsoft-Windows-DotNETRuntime/AssemblyLoader olaylarına göre filtreleyin.
AssemblyName, ActivityID ve Success sütunlarını görünüme ekleyin. içeren olaylara göre filtreleyin MyLibrary.
| Olay Adı | DerlemeAdı | AktiviteID | Başarı |
|---|---|---|---|
AssemblyLoader/Start |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | |
AssemblyLoader/Stop |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | Yanlış |
Bir Start/Stop çiftini Success=False ile olayda görmeniz gerekir, bu da yükleme işleminin başarısız olduğunu gösterir Stop. İ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.
AssemblyName, Stage ve Result sütunlarını görünüme ekleyin.
Start
/
Stop çifti ile etkinlik kimliğine sahip olaylara filtreleyin.
| Olay Adı | DerlemeAdı | 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, AssemblyLoadContext.Resolving olayı için işleyicileri çağırarak ve AppDomain.AssemblyResolve olayı için işleyicileri çağırarak derlemeyi çö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. Sütunları AssemblyName ve HandlerName görünüme ekleyin.
Start
/
Stop çifti ile etkinlik kimliğine sahip olaylara filtreleyin.
| Olay Adı | DerlemeAdı | İşleyiciAdı |
|---|---|---|
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAssemblyLoadContextResolving |
AssemblyLoader/AppDomainAssemblyResolveHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAppDomainAssemblyResolve |
Yukarıdaki olaylar, OnAssemblyLoadContextResolving olayı için adlı AssemblyLoadContext.Resolving işleyicinin çağrıldığını ve OnAppDomainAssemblyResolve olayı için ise adlı AppDomain.AssemblyResolve işleyicinin çağrıldığını gösterir.
Başka bir iz daha topla
Uygulamayı, AssemblyLoadContext.Resolving olay işleyicisinin MyLibrary derlemeyi yükleyeceği şekilde bağımsız değişkenlerle çalıştırın.
AssemblyLoading /d default alc-resolving
.nettrace kullanarak başka bir dosya toplayın ve açın.
Start ve Stop olaylarını MyLibrary için yeniden filtreleyin. Aralarında başka bir Start/Stop olan bir Start/Stop çift görebilmelisiniz. İç yük işlemi, AssemblyLoadContext.Resolving çağrıldığında işleyici AssemblyLoadContext.LoadFromAssemblyPath tarafından tetiklenen yükü temsil eder. Bu kez, Success=True olayında yükleme işleminin başarılı olduğunu gösteren Stop öğesini görmeniz gerekir.
ResultAssemblyPath alanında, sonuçta elde edilen derlemenin yolu gösterilir.
| Olay Adı | DerlemeAdı | AktiviteID | Başarı | SonuçMontajYolu |
|---|---|---|---|---|
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/ | Doğru | C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
AssemblyLoader/Stop |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | Doğru | C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
Ardından, montajın başarıyla çözümlendiği adımı belirlemek için dış yükleme etkinlik kimliği ile ResolutionAttempted olaylarına bakabiliriz. Bu kez olaylar AssemblyLoadContextResolvingEvent fazının başarılı olduğunu gösterecektir.
ResultAssemblyPath alanında, sonuçta elde edilen derlemenin yolu gösterilir.
| Olay Adı | DerlemeAdı | Aşama | Sonuç | SonuçMontajYolu |
|---|---|---|---|---|
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 |
AssemblyLoadContextResolvingHandlerInvoked olaylarına bakmak, OnAssemblyLoadContextResolving adlı işleyicinin çağrıldığını gösterecektir.
ResultAssemblyPath alanı, işleyici tarafından döndürülen derlemenin yolunu gösterir.
| Olay Adı | DerlemeAdı | İşleyiciAdı | SonuçMontajYolu |
|---|---|---|---|
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAssemblyLoadContextResolving |
C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
ResolutionAttempted olayını tetikleyen yükleme algoritmasının adımına ulaşılmadan önce derleme başarıyla yüklendiği için artık AppDomainAssemblyResolveEvent aşamasıyla veya herhangi bir AppDomainAssemblyResolveHandlerInvoked olayıyla ilişkili bir AppDomain.AssemblyResolve olay olmadığını unutmayın.