Dela via


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

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-tracefinns 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 dess stdin och stdout.
  • 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

  1. Navigera till katalogen med det nedladdade exemplet. Skapa programmet med:

    dotnet build
    
  2. 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
    
  3. 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
    
  4. Koppla dotnet-trace till det program som körs.

    dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
    
  5. 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.

PerfView assembly loader filter image

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 – MyLibrarykan 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, ActivityIDoch Success i vyn. Filtrera efter händelser som innehåller MyLibrary.

PerfView Start and Stop events image

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=FalseStop 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, Stageoch Result i vyn. Filtrera efter händelser med aktivitets-ID:t från Start/Stop paret.

PerfView ResolutionAttempted events image

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.

PerfView extension point events image

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.

PerfView successful Start and Stop events image

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.

PerfView successful ResolutionAttempted events image

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.

PerfView successful extension point events image

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.

Se även