Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
- .NET 5 SDK of latere versies
-
dotnet-tracewerktuig
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-tracezorgt ervoor dat invoer en uitvoer worden omgeleid, waardoor je er standaard niet mee kunt communiceren op de console. Gebruik de--show-child-ioschakelaar om metstdinenstdoutte communiceren. - Door het hulpprogramma veilig af te sluiten via Ctrl+C
SIGTERM, 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
Navigeer naar de map met het gedownloade voorbeeld. Bouw de toepassing met:
dotnet buildStart 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
AssemblyLoadContextte laden, zonder de vereiste verwerking voor een succesvolle laadpoging. Navigeer naar de uitvoermap en voer het volgende uit:AssemblyLoading.exe /d defaultZoek de proces-id van de toepassing.
dotnet-trace psIn de uitvoer worden de beschikbare processen weergegeven. Voorbeeld:
35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exeKoppel deze
dotnet-traceaan de actieve toepassing.dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832Druk 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.
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.
| 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.
| 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.
| 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.
| 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.
| 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.
| 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.