Udostępnij przez


Zbieranie szczegółowych informacji o ładowaniu zestawu

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

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-trace powoduje 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 elementami stdin i stdout.
  • Zamknięcie narzędzia za pomocą kombinacji Ctrl+C lub SIGTERM bezpieczne 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

  1. Przejdź do katalogu, w którym znajduje się pobrany przykład. Skompiluj aplikację za pomocą następujących funkcji:

    dotnet build
    
  2. Uruchom 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 default
    
  3. Znajdź identyfikator procesu aplikacji.

    dotnet-trace ps
    

    Dane wyjściowe będą zawierać listę dostępnych procesów. Przykład:

    35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exe
    
  4. Dołącz dotnet-trace do uruchomionej aplikacji.

    dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
    
  5. W 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.

Obraz filtru modułu ładującego zestawów PerfView

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.

Obraz zdarzeń uruchamiania i zatrzymywania PerfView

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.

Obraz zdarzeń narzędzia PerfView ResolutionAttempted

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.

Obraz zdarzeń punktu rozszerzenia PerfView

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.

Obraz pomyślnych zdarzeń uruchamiania i zatrzymywania w PerfView

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.

Obraz zdarzeń narzędzia PerfView dla pomyślnie zakończonych prób rozwiązania

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.

Zdjęcie zdarzeń pomyślnego punktu rozszerzeń PerfView

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.

Zobacz także