Delen via


Gedetailleerde informatie over het laden van assembly's verzamelen

Vanaf .NET 5 kan de runtime gebeurtenissen EventPipe verzenden met gedetailleerde informatie over het laden van beheerde assembly's om te helpen bij het diagnosticeren van problemen met het laden van assembly's. Deze gebeurtenissen worden verzonden door de Microsoft-Windows-DotNETRuntime provider onder het AssemblyLoader trefwoord (0x4).

Vereisten

Notitie

Het bereik van mogelijkheden is groter dan het verzamelen van gedetailleerde informatie over het laden van dotnet-trace assembly's. Zie voor meer informatie over het gebruik van dotnet-trace.dotnet-trace

Een tracering verzamelen met gebeurtenissen voor het laden van assembly's

U kunt dotnet-trace een bestaand proces traceren of een onderliggend proces starten en traceren vanaf het opstarten.

Een bestaand proces traceren

Als u het laden van assembly-gebeurtenissen in de runtime wilt inschakelen en er een tracering van wilt verzamelen, gebruikt dotnet-trace u de volgende opdracht:

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

Met deze opdracht wordt een tracering van de opgegeven gegevens verzameld <pid>, waardoor de AssemblyLoader gebeurtenissen in de Microsoft-Windows-DotNETRuntime provider worden ingeschakeld. Het resultaat is een .nettrace bestand.

Dotnet-trace gebruiken om een onderliggend proces te starten en te traceren vanaf het opstarten

Soms kan het handig zijn om een tracering van een proces te verzamelen van het opstarten. Voor apps met .NET 5 of hoger kunt u dit doen dotnet-trace .

De volgende opdracht start hello.exe met arg1 en arg2 als opdrachtregelargumenten en verzamelt een tracering vanaf het opstarten van de runtime:

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

U kunt het verzamelen van de trace stoppen door op Enter of Ctrl + C te drukken. Hiermee sluit u ook hello.exe.

Notitie

  • Het starten van hello.exe via dotnet-trace omleiding van de invoer en uitvoer, en u kunt er niet standaard mee werken op de console. Gebruik de --show-child-io schakeloptie om te communiceren met stdin de en stdout.
  • Als u het hulpprogramma afsluit via Ctrl+C of het hulpprogramma veilig beëindigt, SIGTERM worden zowel het hulpprogramma als het onderliggende proces beëindigd.
  • Als het onderliggende proces wordt afgesloten voordat het hulpprogramma wordt afgesloten, wordt het hulpprogramma ook afgesloten en moet de trace veilig zichtbaar zijn.

Een trace weergeven

Het verzamelde traceringsbestand kan worden weergegeven in Windows met behulp van de weergave Gebeurtenissen in PerfView. Alle assembly-laadgebeurtenissen worden voorafgegaan door Microsoft-Windows-DotNETRuntime/AssemblyLoader.

Voorbeeld (in Windows)

In dit voorbeeld wordt het voorbeeld van het laden van extensiepunten voor assembly's gebruikt. De toepassing probeert een assembly MyLibrary te laden: een assembly waarnaar niet wordt verwezen door de toepassing en vereist dus verwerking in een assembly-laaduitbreidingspunt om te worden geladen.

De tracering verzamelen

  1. Navigeer naar de map met het gedownloade voorbeeld. Bouw de toepassing met:

    dotnet build
    
  2. Start de toepassing met argumenten die aangeven dat deze moet worden onderbroken en wacht op een toets. Bij hervatting wordt geprobeerd om de assembly in de standaardinstelling AssemblyLoadContext te laden, zonder de verwerking die nodig is voor een geslaagde belasting. Navigeer naar de uitvoermap en voer het volgende uit:

    AssemblyLoading.exe /d default
    
  3. Zoek de proces-id van de toepassing.

    dotnet-trace ps
    

    In de uitvoer worden de beschikbare processen weergegeven. Voorbeeld:

    35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exe
    
  4. Koppel deze dotnet-trace aan de actieve toepassing.

    dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
    
  5. Druk in het venster met de toepassing op een willekeurige toets om het programma door te laten gaan. Tracering wordt automatisch gestopt zodra de toepassing wordt afgesloten.

De tracering weergeven

Open de verzamelde trace in PerfView en open de weergave Gebeurtenissen. Filter de lijst met gebeurtenissen op Microsoft-Windows-DotNETRuntime/AssemblyLoader gebeurtenissen.

PerfView assembly loader filter image

Alle assemblybelastingen die in de toepassing zijn opgetreden nadat de tracering is gestart, worden weergegeven. Als u de belastingsbewerking voor de assembly van belang voor dit voorbeeld MyLibrarywilt controleren, kunnen we nog wat meer filteren.

Assemblybelastingen

Filter de weergave naar de Start en Stop gebeurtenissen onder Microsoft-Windows-DotNETRuntime/AssemblyLoader met behulp van de lijst met gebeurtenissen aan de linkerkant. Voeg de kolommen AssemblyNameen ActivityIDSuccess de weergave toe. Filteren op gebeurtenissen met MyLibrary.

PerfView Start and Stop events image

Gebeurtenisnaam AssemblyName ActivityID Geslaagd
AssemblyLoader/Start MyLibrary, Culture=neutral, PublicKeyToken=null 1/2/
AssemblyLoader/Stop MyLibrary, Culture=neutral, PublicKeyToken=null 1/2/ Onwaar

Als het goed is, ziet u één Start/Stop paar voor Success=False de gebeurtenis, waarmee wordt aangegeven dat de Stop laadbewerking is mislukt. Houd er rekening mee dat de twee gebeurtenissen dezelfde activiteits-id hebben. De activiteits-id kan worden gebruikt om alle andere gebeurtenissen van het assemblylaadprogramma te filteren op alleen de gebeurtenissen die overeenkomen met deze belastingsbewerking.

Uitsplitsing van poging om te laden

Voor een gedetailleerdere uitsplitsing van de belastingsbewerking filtert u de weergave naar de ResolutionAttempted gebeurtenissen onder Microsoft-Windows-DotNETRuntime/AssemblyLoader met behulp van de lijst met gebeurtenissen aan de linkerkant. Voeg de kolommen AssemblyNameen StageResult de weergave toe. Filter op gebeurtenissen met de activiteits-id van het Start/Stop paar.

PerfView ResolutionAttempted events image

Gebeurtenisnaam AssemblyName Fase Resultaat
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

De bovenstaande gebeurtenissen geven aan dat het assemblylaadprogramma heeft geprobeerd de assembly op te lossen door in de huidige belastingcontext te zoeken, de standaardprobactielogica uit te voeren voor beheerde toepassingsassembly's, handlers aan te roepen voor de AssemblyLoadContext.Resolving gebeurtenis en handlers aan te roepen voor de AppDomain.AssemblyResolve. Voor al deze stappen is de assembly niet gevonden.

Uitbreidingspunten

Als u wilt zien welke extensiepunten zijn aangeroepen, filtert u de weergave naar de AssemblyLoadContextResolvingHandlerInvoked en AppDomainAssemblyResolveHandlerInvoked onder Microsoft-Windows-DotNETRuntime/AssemblyLoader de lijst met gebeurtenissen aan de linkerkant. Voeg de kolommen AssemblyName en HandlerName de weergave toe. Filter op gebeurtenissen met de activiteits-id van het Start/Stop paar.

PerfView extension point events image

Gebeurtenisnaam AssemblyName HandlerName
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked MyLibrary, Culture=neutral, PublicKeyToken=null OnAssemblyLoadContextResolving
AssemblyLoader/AppDomainAssemblyResolveHandlerInvoked MyLibrary, Culture=neutral, PublicKeyToken=null OnAppDomainAssemblyResolve

De bovenstaande gebeurtenissen geven aan dat een handler met de naam OnAssemblyLoadContextResolving is aangeroepen voor de AssemblyLoadContext.Resolving gebeurtenis en dat er een handler met de naam OnAppDomainAssemblyResolve is aangeroepen voor de AppDomain.AssemblyResolve gebeurtenis.

Een andere tracering verzamelen

Voer de toepassing uit met argumenten, zodat de handler voor de AssemblyLoadContext.Resolving gebeurtenis de MyLibrary assembly laadt.

AssemblyLoading /d default alc-resolving

Verzamel en open een ander .nettrace bestand met behulp van de bovenstaande stappen.

Filter opnieuw op de Start gebeurtenissen en Stop de gebeurtenissen.MyLibrary Als het goed is, ziet u een paar met een Start/Stop andere Start/Stop koppeling. De interne laadbewerking vertegenwoordigt de belasting die wordt geactiveerd door de handler voor AssemblyLoadContext.Resolving wanneer deze wordt aangeroepen AssemblyLoadContext.LoadFromAssemblyPath. Deze keer ziet Success=True u de Stop gebeurtenis, waarmee wordt aangegeven dat de laadbewerking is geslaagd. Het ResultAssemblyPath veld toont het pad van de resulterende assembly.

PerfView successful Start and Stop events image

Gebeurtenisnaam AssemblyName ActivityID Geslaagd 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/ Waar C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll
AssemblyLoader/Stop MyLibrary, Culture=neutral, PublicKeyToken=null 1/2/ Waar C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll

Vervolgens kunnen we de ResolutionAttempted gebeurtenissen met de activiteits-id van de buitenste belasting bekijken om de stap te bepalen waarmee de assembly is opgelost. Deze keer laten de gebeurtenissen zien dat de AssemblyLoadContextResolvingEvent fase is geslaagd. Het ResultAssemblyPath veld toont het pad van de resulterende assembly.

PerfView successful ResolutionAttempted events image

Gebeurtenisnaam AssemblyName Fase Resultaat 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

Als u gebeurtenissen bekijkt AssemblyLoadContextResolvingHandlerInvoked , ziet u dat de handler met de naam OnAssemblyLoadContextResolving is aangeroepen. Het ResultAssemblyPath veld toont het pad van de assembly die door de handler wordt geretourneerd.

PerfView successful extension point events image

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

Houd er rekening mee dat er geen gebeurtenis meer ResolutionAttempted is met de AppDomainAssemblyResolveEvent fase of gebeurtenissen AppDomainAssemblyResolveHandlerInvoked , omdat de assembly is geladen voordat de stap van het laadalgoritmen wordt bereikt waarmee de AppDomain.AssemblyResolve gebeurtenis wordt gegenereerd.

Zie ook