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
- .NET 5 SDK of latere versies
dotnet-trace
Tool
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 metstdin
de enstdout
. - 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
Navigeer naar de map met het gedownloade voorbeeld. Bouw de toepassing met:
dotnet build
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
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
Koppel deze
dotnet-trace
aan de actieve toepassing.dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
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.
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 MyLibrary
wilt 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 AssemblyName
en ActivityID
Success
de weergave toe. Filteren op gebeurtenissen met MyLibrary
.
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 AssemblyName
en Stage
Result
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 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.
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.
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.
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 | 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.