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).

Vereiste voorwaarden

Opmerking

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

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

U kunt dotnet-trace gebruiken om een bestaand proces te traceren of een subproces te starten en het vanaf het opstarten te traceren.

Een bestaand proces traceren

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

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

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

Dotnet-trace gebruiken om een subproces te starten en te traceren vanaf de start

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 .

Met de volgende opdracht wordt hello.exe gestart met arg1 en arg2 als opdrachtregelargumenten en wordt een trace verzameld van de opstart 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.

Opmerking

  • Het starten van hello.exe via dotnet-trace zorgt ervoor dat invoer en uitvoer worden omgeleid, waardoor je er standaard niet mee kunt communiceren op de console. Gebruik de --show-child-io schakelaar om met stdin en stdout te communiceren.
  • Door het hulpprogramma veilig af te sluiten via Ctrl+CSIGTERM, worden zowel het hulpprogramma als het onderliggende proces beëindigd.
  • Als het subproces wordt afgesloten voordat het hulpprogramma is geëindigd, 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.

Verzamel het spoor

  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 de assembly in de standaardomgeving AssemblyLoadContext te laden, zonder de vereiste verwerking voor een succesvolle laadpoging. 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 houdt automatisch op wanneer de toepassing afgesloten wordt.

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.

Afbeelding van PerfView-assemblyloaderfilter

Alle assembly-ladingen die in de toepassing hebben plaatsgevonden nadat de tracering is gestart, worden weergegeven. Om de laadbewerking voor de samenstelling van belang voor dit voorbeeld MyLibrary te inspecteren, kunnen we meer filteren.

Montagelasten

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.

Afbeelding van start- en stopgebeurtenissen in PerfView

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

U zou één Start/Stop paar met Success=False op Stop evenement moeten zien, wat aangeeft dat de 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.

Afbeelding van PerfView ResolutionAttempted-gebeurtenissen

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 werd de assembly niet gevonden.

Extensiepunten

Als u wilt zien welke extensiepunten zijn aangeroepen, filtert u de weergave naar AssemblyLoadContextResolvingHandlerInvoked en AppDomainAssemblyResolveHandlerInvoked, onder Microsoft-Windows-DotNETRuntime/AssemblyLoader, met 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.

Afbeelding van PerfView-extensiepunt-evenementen

Gebeurtenisnaam AssemblyName HandlerNaam
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.

Nog een spoor 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 naar de Start en Stop evenementen voor MyLibrary. U zou een Start/Stop paar moeten zien met een andere Start/Stop ertussen. De interne laadbewerking vertegenwoordigt de belasting die wordt geactiveerd door de handler voor AssemblyLoadContext.Resolving wanneer deze wordt aangeroepen AssemblyLoadContext.LoadFromAssemblyPath. Deze keer zou u Success=True moeten zien op de Stop gebeurtenis, wat aangeeft dat de laadbewerking is geslaagd. Het ResultAssemblyPath veld toont het pad van de resulterende assembly.

Afbeelding van succesvolle start- en stop-gebeurtenissen in PerfView

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

Vervolgens kunnen we de ResolutionAttempted gebeurtenissen met de Activiteits-ID van de externe lading bekijken om de stap te bepalen waarmee de assembly succesvol 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 afbeelding van geslaagde ResolutionAttempted-gebeurtenissen

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.

Afbeelding van succesvolle extensiepuntgebeurtenissen in PerfView

Gebeurtenisnaam Assemblagenaam HandlerNaam 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 ResolutionAttempted meer is bij de AppDomainAssemblyResolveEvent fase of AppDomainAssemblyResolveHandlerInvoked gebeurtenissen meer, omdat de assembly is geladen voordat de stap van het laadalgoritme wordt bereikt waarmee de AppDomain.AssemblyResolve gebeurtenis wordt gegenereerd.

Zie ook