Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Począwszy od platformy .NET 5, środowisko uruchomieniowe może emitować zdarzenia za pomocą EventPipe, zawierając szczegółowe informacje o ładowaniu zestawów zarządzanych, aby pomóc w diagnozowaniu problemów związanych z ładowaniem zestawów. Te zdarzenia są emitowane przez dostawcę Microsoft-Windows-DotNETRuntime pod słowem kluczowym AssemblyLoader (0x4).
Wymagania wstępne
- .NET 5 SDK lub nowsze wersje
-
dotnet-tracenarzędzie
Uwaga / Notatka
Zakres dotnet-trace możliwości obejmuje więcej niż tylko zbieranie szczegółowych informacji o ładowaniu modułów. Aby uzyskać więcej informacji na temat użycia programu dotnet-trace, zobacz dotnet-trace.
Zbierz ślad ze zdarzeniami ładowania zestawu
Możesz użyć dotnet-trace do śledzenia istniejącego procesu lub uruchomienia procesu podrzędnego i śledzenia go od momentu uruchomienia.
Śledzenie istniejącego procesu
Aby w środowisku uruchomieniowym włączyć zdarzenia ładowania zestawu i zebrać ich ślad, użyj następującego polecenia: dotnet-trace
dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id <pid>
To polecenie zbiera ślad określonego <pid>, włączając zdarzenia AssemblyLoader w dostawcy Microsoft-Windows-DotNETRuntime. Wynikiem jest plik .nettrace .
Użyj polecenia dotnet-trace, aby uruchomić proces podrzędny i prześledzić go od momentu uruchomienia.
Czasami przydatne może być zebranie śladu procesu od jego uruchomienia. W przypadku aplikacji z platformą .NET 5 lub nowszą można użyć dotnet-trace do tego.
Następujące polecenie uruchamia hello.exe z arg1 i arg2 jako argumentami wiersza polecenia i zbiera ślad z jego uruchamiania:
dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 -- hello.exe arg1 arg2
Możesz zatrzymać zbieranie śladu, naciskając Enter lub Ctrl + C. Spowoduje to również zamknięcie hello.exe.
Uwaga / Notatka
- Uruchomienie hello.exe przez
dotnet-tracepowoduje przekierowanie jego wejścia i wyjścia, co oznacza, że domyślnie nie można z nim wchodzić w interakcje za pomocą konsoli. Użyj przełącznika--show-child-io, aby wejść w interakcję z elementamistdinistdout. - Zamknięcie narzędzia za pomocą kombinacji Ctrl+C lub
SIGTERMbezpieczne zakończenie zarówno narzędzia, jak i procesu podrzędnego. - Jeśli proces podrzędny zakończy się przed narzędziem, narzędzie również zakończy działanie, a ślad powinien być bezpiecznie wyświetlany.
Wyświetl ślad
Zebrany plik śledzenia można wyświetlić w systemie Windows przy użyciu widoku Zdarzenia w programie PerfView. Wszystkie zdarzenia ładowania zestawu będą poprzedzone prefiksem Microsoft-Windows-DotNETRuntime/AssemblyLoader.
Przykład (w systemie Windows)
W tym przykładzie użyto próbki punktów rozszerzenia ładowania zestawu. Aplikacja próbuje załadować zestaw MyLibrary — zestaw, który nie jest referencjonowany przez aplikację i dlatego wymaga obsługi w punkcie rozszerzenia ładowania zestawów, aby został pomyślnie załadowany.
Zbierz ślad
Przejdź do katalogu, w którym znajduje się pobrany przykład. Skompiluj aplikację za pomocą następujących funkcji:
dotnet buildUruchom aplikację z argumentami, które wskazują, że powinna zostać wstrzymana i oczekiwać na naciśnięcie klawisza. Po wznowieniu podejmie próbę załadowania zestawu w domyślnym stanie
AssemblyLoadContext— bez obsługi wymaganej do pomyślnego załadowania. Przejdź do katalogu wyjściowego i uruchom.AssemblyLoading.exe /d defaultZnajdź identyfikator procesu aplikacji.
dotnet-trace psDane wyjściowe będą zawierać listę dostępnych procesów. Przykład:
35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exeDołącz
dotnet-tracedo uruchomionej aplikacji.dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832W oknie z uruchomioną aplikacją naciśnij dowolny klawisz, aby kontynuować działanie programu. Śledzenie zostanie automatycznie zatrzymane po zakończeniu działania aplikacji.
Wyświetl ślad
Otwórz zebrany ślad w widoku PerfView i otwórz widok Zdarzenia. Filtruj listę zdarzeń według Microsoft-Windows-DotNETRuntime/AssemblyLoader.
Wszystkie ładowania modułów, które wystąpiły w aplikacji po rozpoczęciu śledzenia, zostaną pokazane. Aby sprawdzić operację ładowania dla interesującego nas zestawu w tym przykładzie - MyLibrary, możemy wykonać więcej filtrowania.
Ładowanie zestawów
Przefiltruj widok na zdarzenia Start i Stop pod obszarem Microsoft-Windows-DotNETRuntime/AssemblyLoader, korzystając z listy zdarzeń po lewej. Dodaj kolumny AssemblyName, ActivityIDi Success do widoku. Filtruj na zdarzenia zawierające MyLibrary.
| Nazwa zdarzenia | Nazwa zestawu | Identyfikator aktywności | Powodzenie |
|---|---|---|---|
AssemblyLoader/Start |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | |
AssemblyLoader/Stop |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | Nieprawda |
Powinna zostać wyświetlona jedna Start/Stop para z Success=False zdarzeniem Stop wskazująca, że operacja ładowania nie powiodła się. Należy pamiętać, że dwa zdarzenia mają ten sam identyfikator działania. Identyfikator działania pozwala na filtrowanie wszystkich innych zdarzeń modułu ładującego zestawów, pozostawiając tylko te odpowiadające tej operacji ładowania.
Awaria próby załadowania
Aby uzyskać bardziej szczegółową analizę operacji ładowania, przefiltruj widok na ResolutionAttempted zdarzenia w obszarze Microsoft-Windows-DotNETRuntime/AssemblyLoader przy użyciu listy zdarzeń po lewej stronie. Dodaj kolumny AssemblyName, Stagei Result do widoku. Filtruj wydarzenia na podstawie identyfikatora Start/Stop z pary.
| Nazwa zdarzenia | Nazwa zestawu | Etap | Wynik |
|---|---|---|---|
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 |
Powyższe zdarzenia wskazują, że moduł ładujący zestaw próbował rozwiązać zestaw, sprawdzając w bieżącym kontekście ładowania, uruchamiając domyślną logikę sondowania dla zarządzanych zestawów aplikacji, wywołując moduły obsługujące zdarzenie AssemblyLoadContext.Resolving oraz moduły obsługujące AppDomain.AssemblyResolve. W przypadku wszystkich tych kroków zestaw nie został znaleziony.
Punkty rozszerzeń
Aby sprawdzić, które punkty rozszerzenia zostały wywołane, przefiltruj widok na AssemblyLoadContextResolvingHandlerInvoked i AppDomainAssemblyResolveHandlerInvoked pod Microsoft-Windows-DotNETRuntime/AssemblyLoader przy użyciu listy zdarzeń po lewej stronie. Dodaj kolumny AssemblyName i HandlerName do widoku. Filtruj wydarzenia na podstawie identyfikatora Start/Stop z pary.
| Nazwa zdarzenia | Nazwa zestawu | Nazwa programu obsługi |
|---|---|---|
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAssemblyLoadContextResolving |
AssemblyLoader/AppDomainAssemblyResolveHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAppDomainAssemblyResolve |
Powyższe zdarzenia wskazują, że program obsługi o nazwie OnAssemblyLoadContextResolving został wywołany dla zdarzenia AssemblyLoadContext.Resolving, a program obsługi o nazwie OnAppDomainAssemblyResolve został wywołany dla zdarzenia AppDomain.AssemblyResolve.
Zbierz kolejny ślad
Uruchom aplikację z argumentami, tak aby jej procedura obsługi zdarzenia AssemblyLoadContext.Resolving załadowała zestaw MyLibrary.
AssemblyLoading /d default alc-resolving
Zbierz i otwórz inny .nettrace plik, wykonując kroki opisane powyżej.
Przefiltruj zdarzenia Start i Stop dla MyLibrary ponownie. Powinien być widoczny zestaw Start/Stop, z innym Start/Stop umieszczonym między nimi. Operacja ładowania wewnętrznego reprezentuje obciążenie wyzwalane przez program obsługi dla AssemblyLoadContext.Resolving gdy wywołuje metodę AssemblyLoadContext.LoadFromAssemblyPath. Tym razem powinno zostać wyświetlone Success=True w Stop zdarzeniu, wskazując, że operacja ładowania zakończyła się pomyślnie. Pole ResultAssemblyPath zawiera ścieżkę wynikowego zestawu.
| Nazwa zdarzenia | Nazwa zestawu | Identyfikator aktywności | Powodzenie | 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/ | Prawda | C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
AssemblyLoader/Stop |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | Prawda | C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
Następnie możemy przyjrzeć się ResolutionAttempted zdarzeń o identyfikatorze działania z obciążenia zewnętrznego, aby określić krok, w którym zestaw został pomyślnie rozwiązany. Tym razem zdarzenia pokażą, że AssemblyLoadContextResolvingEvent etap zakończył się pomyślnie. Pole ResultAssemblyPath zawiera ścieżkę wynikowego zestawu.
| Nazwa zdarzenia | Nazwa zestawu | Etap | Wynik | 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 |
Patrząc na zdarzenia AssemblyLoadContextResolvingHandlerInvoked, widać, że procedura obsługi o nazwie OnAssemblyLoadContextResolving została wywołana. Pole ResultAssemblyPath pokazuje ścieżkę zestawu zwróconego przez obsługującego.
| Nazwa zdarzenia | Nazwa zestawu | Nazwa programu obsługi | ResultAssemblyPath |
|---|---|---|---|
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAssemblyLoadContextResolving |
C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
Należy pamiętać, że nie ma już ResolutionAttempted zdarzenia z AppDomainAssemblyResolveEvent etapem lub żadnym AppDomainAssemblyResolveHandlerInvoked zdarzeniem, ponieważ zestaw został pomyślnie załadowany przed osiągnięciem kroku algorytmu ładowania, który wywołuje AppDomain.AssemblyResolve zdarzenie.