Samla in detaljerad information om monteringsinläsning
Från och med .NET 5 kan körningen generera händelser med EventPipe
detaljerad information om hanterad monteringsinläsning för att hjälpa dig att diagnostisera problem med monteringsinläsning. Dessa händelser genereras av providern Microsoft-Windows-DotNETRuntime
under nyckelordet AssemblyLoader
(0x4
).
Förutsättningar
- .NET 5 SDK eller senare versioner
dotnet-trace
Verktyg
Kommentar
Omfånget för dotnet-trace
funktioner är större än att samla in detaljerad information om sammansättningsinläsning. Mer information om användningen av dotnet-trace
finns i dotnet-trace
.
Samla in en spårning med sammansättningsinläsningshändelser
Du kan använda dotnet-trace
för att spåra en befintlig process eller för att starta en underordnad process och spåra den från start.
Spåra en befintlig process
Om du vill aktivera händelser för sammansättningsinläsning i körningen och samla in en spårning av dem använder du dotnet-trace
med följande kommando:
dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id <pid>
Det här kommandot samlar in en spårning av den angivna <pid>
och aktiverar AssemblyLoader
händelserna i providern Microsoft-Windows-DotNETRuntime
. Resultatet är en .nettrace
fil.
Använda dotnet-trace för att starta en underordnad process och spåra den från start
Ibland kan det vara användbart att samla in en spårning av en process från starten. För appar som kör .NET 5 eller senare kan du använda dotnet-trace
för att göra detta.
Följande kommando startar hello.exe med arg1
och arg2
som kommandoradsargument och samlar in en spårning från körningsstarten:
dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 -- hello.exe arg1 arg2
Du kan sluta samla in spårningen genom att trycka på Retur eller Ctrl + C. Detta stänger också hello.exe.
Kommentar
- Om du startar hello.exe via
dotnet-trace
omdirigeras dess indata och utdata, och du kommer inte att kunna interagera med den i konsolen som standard. Använd växeln--show-child-io
för att interagera med dessstdin
ochstdout
. - När verktyget avslutas via Ctrl+C eller
SIGTERM
avslutas på ett säkert sätt både verktyget och den underordnade processen. - Om den underordnade processen avslutas innan verktyget avslutas även verktyget och spårningen ska vara säkert synlig.
Visa en spårning
Den insamlade spårningsfilen kan visas i Windows med hjälp av händelsevyn i PerfView. Alla sammansättningsinläsningshändelser kommer att prefixeras med Microsoft-Windows-DotNETRuntime/AssemblyLoader
.
Exempel (i Windows)
I det här exemplet används exemplet för sammansättningsinläsning av tilläggspunkter. Programmet försöker läsa in en sammansättning MyLibrary
– en sammansättning som inte refereras av programmet och som därför kräver att hantering i en tilläggspunkt för monteringsinläsning läses in.
Samla in spårningen
Navigera till katalogen med det nedladdade exemplet. Skapa programmet med:
dotnet build
Starta programmet med argument som anger att det ska pausas i väntan på en tangenttryckning. Vid återupptagandet kommer den att försöka läsa in sammansättningen i standardinställningen
AssemblyLoadContext
– utan den hantering som krävs för en lyckad belastning. Navigera till utdatakatalogen och kör:AssemblyLoading.exe /d default
Hitta programmets process-ID.
dotnet-trace ps
Utdata visar de tillgängliga processerna. Till exempel:
35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exe
Koppla
dotnet-trace
till det program som körs.dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
I fönstret som kör programmet trycker du på valfri tangent för att låta programmet fortsätta. Spårningen stoppas automatiskt när programmet avslutas.
Visa spårningen
Öppna den insamlade spårningen i PerfView och öppna vyn Händelser. Filtrera händelselistan till Microsoft-Windows-DotNETRuntime/AssemblyLoader
händelser.
Alla sammansättningsbelastningar som inträffade i programmet efter att spårningen startats visas. Om du vill granska belastningsåtgärden för sammansättningen av intresse för det här exemplet – MyLibrary
kan vi göra lite mer filtrering.
Monteringsbelastningar
Filtrera vyn till Start
händelserna och Stop
under Microsoft-Windows-DotNETRuntime/AssemblyLoader
med hjälp av händelselistan till vänster. Lägg till kolumnerna AssemblyName
, ActivityID
och Success
i vyn. Filtrera efter händelser som innehåller MyLibrary
.
Händelsenamn | AssemblyName | ActivityID | Klart |
---|---|---|---|
AssemblyLoader/Start |
MyLibrary, Culture=neutral, PublicKeyToken=null |
1/2/ | |
AssemblyLoader/Stop |
MyLibrary, Culture=neutral, PublicKeyToken=null |
1/2/ | Falsk |
Du bör se ett Start
/Stop
par med Success=False
på Stop
händelsen, vilket indikerar att inläsningsåtgärden misslyckades. Observera att de två händelserna har samma aktivitets-ID. Aktivitets-ID:t kan användas för att filtrera alla andra sammansättningsinläsningshändelser till bara de som motsvarar den här belastningsåtgärden.
Uppdelning av försök att läsa in
Om du vill ha en mer detaljerad uppdelning av belastningsåtgärden filtrerar du vyn efter händelserna ResolutionAttempted
under Microsoft-Windows-DotNETRuntime/AssemblyLoader
med hjälp av händelselistan till vänster. Lägg till kolumnerna AssemblyName
, Stage
och Result
i vyn. Filtrera efter händelser med aktivitets-ID:t från Start
/Stop
paret.
Händelsenamn | AssemblyName | Fas | Resultat |
---|---|---|---|
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 |
Händelserna ovan anger att sammansättningsinläsaren försökte lösa sammansättningen genom att titta i den aktuella belastningskontexten, köra standardlogik för avsökning för hanterade programsammansättningar, anropa hanterare för AssemblyLoadContext.Resolving händelsen och anropa hanterare för AppDomain.AssemblyResolve. För alla dessa steg hittades inte sammansättningen.
Tilläggspunkter
Om du vill se vilka tilläggspunkter som anropades filtrerar du vyn till och AppDomainAssemblyResolveHandlerInvoked
under Microsoft-Windows-DotNETRuntime/AssemblyLoader
med hjälp av händelselistan till AssemblyLoadContextResolvingHandlerInvoked
vänster. Lägg till kolumnerna AssemblyName
och HandlerName
i vyn. Filtrera efter händelser med aktivitets-ID:t från Start
/Stop
paret.
Händelsenamn | AssemblyName | HandlerName |
---|---|---|
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAssemblyLoadContextResolving |
AssemblyLoader/AppDomainAssemblyResolveHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAppDomainAssemblyResolve |
Händelserna ovan anger att en hanterare med namnet OnAssemblyLoadContextResolving
anropades för AssemblyLoadContext.Resolving händelsen och att en hanterare med namnet OnAppDomainAssemblyResolve
anropades för AppDomain.AssemblyResolve händelsen.
Samla in en annan spårning
Kör programmet med argument som gör att dess hanterare för AssemblyLoadContext.Resolving händelsen läser in MyLibrary
sammansättningen.
AssemblyLoading /d default alc-resolving
Samla in och öppna en annan .nettrace
fil med hjälp av stegen ovan.
Filtrera efter Start
händelserna och Stop
för MyLibrary
igen. Du bör se ett Start
/Stop
par med ett annat Start
/Stop
mellan dem. Den inre inläsningsåtgärden representerar den belastning som utlöstes av hanteraren för AssemblyLoadContext.Resolving när den anropade AssemblyLoadContext.LoadFromAssemblyPath. Den här gången bör du se Success=True
händelsen Stop
som anger att belastningsåtgärden har slutförts. Fältet ResultAssemblyPath
visar sökvägen till den resulterande sammansättningen.
Händelsenamn | AssemblyName | ActivityID | Klart | 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/ | Sant | C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
AssemblyLoader/Stop |
MyLibrary, Culture=neutral, PublicKeyToken=null |
1/2/ | Sant | C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
Vi kan sedan titta på ResolutionAttempted
händelserna med aktivitets-ID:t från den yttre belastningen för att fastställa det steg där sammansättningen har lösts. Den här gången visar händelserna att AssemblyLoadContextResolvingEvent
fasen lyckades. Fältet ResultAssemblyPath
visar sökvägen till den resulterande sammansättningen.
Händelsenamn | AssemblyName | Fas | Resultat | 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 |
Om du tittar på AssemblyLoadContextResolvingHandlerInvoked
händelser visas att den namngivna OnAssemblyLoadContextResolving
hanteraren anropades. Fältet ResultAssemblyPath
visar sökvägen till sammansättningen som returneras av hanteraren.
Händelsenamn | AssemblyName | HandlerName | ResultAssemblyPath |
---|---|---|---|
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAssemblyLoadContextResolving |
C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
Observera att det inte längre finns någon ResolutionAttempted
händelse med AppDomainAssemblyResolveEvent
fasen eller några AppDomainAssemblyResolveHandlerInvoked
händelser, eftersom sammansättningen lästes in innan du nådde steget i inläsningsalgoritmen som genererar AppDomain.AssemblyResolve händelsen.