Sdílet prostřednictvím


Shromáždění podrobných informací o načítání sestavení

Od .NET 5 může modul runtime generovat události s EventPipe podrobnými informacemi o načítání spravovaných sestavení, aby pomohl diagnostikovat problémy s načítáním sestavení. Tyto události generují poskytovatel pod klíčovým slovem Microsoft-Windows-DotNETRuntimeAssemblyLoader (0x4).

Požadavky

Poznámka:

Rozsah schopností je větší než shromažďování podrobných dotnet-trace informací o načítání sestavení. Další informace o využití dotnet-tracenaleznete v tématu dotnet-trace.

Shromažďování trasování s událostmi načítání sestavení

Můžete použít dotnet-trace ke sledování existujícího procesu nebo ke spuštění podřízeného procesu a jeho trasování od spuštění.

Trasování existujícího procesu

Pokud chcete povolit události načítání sestavení v modulu runtime a shromáždit jejich trasování, použijte dotnet-trace následující příkaz:

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

Tento příkaz shromažďuje trasování zadaného <pid>příkazu, který umožňuje AssemblyLoader události ve zprostředkovateli Microsoft-Windows-DotNETRuntime . Výsledkem je .nettrace soubor.

Použití dotnet-trace ke spuštění podřízeného procesu a jeho trasování od spuštění

Někdy může být užitečné shromáždit trasování procesu od jeho spuštění. V případě aplikací, na kterých běží .NET 5 nebo novější, můžete k tomu použít dotnet-trace .

Následující příkaz spustí hello.exe s arg1 argumenty příkazového řádku a arg2 jako argumenty příkazového řádku a shromáždí trasování z spuštění modulu runtime:

dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 -- hello.exe arg1 arg2

Trasování můžete zastavit stisknutím klávesy Enter nebo Ctrl + C. Tím se také zavře hello.exe.

Poznámka:

  • Spuštění hello.exe přesměruje dotnet-trace jeho vstup a výstup a ve výchozím nastavení s ním nebudete moct pracovat v konzole. --show-child-io Pomocí přepínače můžete pracovat s jeho stdin a stdout.
  • Ukončete nástroj pomocí kláves Ctrl+C nebo SIGTERM bezpečně ukončíte nástroj i podřízený proces.
  • Pokud se podřízený proces ukončí před nástrojem, nástroj se ukončí a trasování by mělo být bezpečně zobrazitelné.

Zobrazení trasování

Shromážděný trasovací soubor lze zobrazit ve Windows pomocí zobrazení Události v nástroji PerfView. Všechny události načítání sestavení budou mít předponu Microsoft-Windows-DotNETRuntime/AssemblyLoader.

Příklad (ve Windows)

V tomto příkladu se používá ukázka bodů načítání sestavení. Aplikace se pokusí načíst sestavení – sestavení MyLibrary , na které aplikace neodkazuje, a proto vyžaduje, aby bylo úspěšně načteno zpracování v bodu načítání sestavení.

Shromáždění trasování

  1. Přejděte do adresáře s staženou ukázkou. Sestavte aplikaci pomocí:

    dotnet build
    
  2. Spusťte aplikaci s argumenty, které označují, že by se měla pozastavit, a počkejte na stisknutí klávesy. Při obnovení se pokusí načíst sestavení ve výchozím nastavení AssemblyLoadContext bez zpracování potřebného pro úspěšné načtení. Přejděte do výstupního adresáře a spusťte:

    AssemblyLoading.exe /d default
    
  3. Vyhledejte ID procesu aplikace.

    dotnet-trace ps
    

    Výstup zobrazí seznam dostupných procesů. Příklad:

    35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exe
    
  4. Připojte dotnet-trace se ke spuštěné aplikaci.

    dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
    
  5. V okně, ve kterém je aplikace spuštěná, stiskněte libovolnou klávesu, aby program pokračoval. Trasování se po ukončení aplikace automaticky zastaví.

Zobrazení trasování

Otevřete shromážděné trasování v nástroji PerfView a otevřete zobrazení Události. Vyfiltrujte seznam událostí na Microsoft-Windows-DotNETRuntime/AssemblyLoader události.

PerfView assembly loader filter image

Zobrazí se všechna načtení sestavení, ke kterým došlo v aplikaci po spuštění trasování. Pokud chcete zkontrolovat operaci načítání pro sestavení, které je pro tento příklad zajímavé – MyLibrarymůžeme provést další filtrování.

Načtení sestavení

Vyfiltrujte zobrazení na Start události a Stop události v seznamu událostí Microsoft-Windows-DotNETRuntime/AssemblyLoader na levé straně. Přidejte sloupce AssemblyNamea ActivityIDSuccess do zobrazení. Filtrovat podle událostí obsahujících MyLibrary.

PerfView Start and Stop events image

Název události Assemblyname ActivityID Success
AssemblyLoader/Start MyLibrary, Culture=neutral, PublicKeyToken=null 1/2/
AssemblyLoader/Stop MyLibrary, Culture=neutral, PublicKeyToken=null 1/2/ False

V události by se měla zobrazit jedna Start/Stop dvojice StopSuccess=False, která značí, že operace načítání selhala. Všimněte si, že tyto dvě události mají stejné ID aktivity. ID aktivity lze použít k filtrování všech ostatních událostí zavaděče sestavení pouze na ty, které odpovídají této operaci načítání.

Rozpis pokusu o načtení

Pokud chcete podrobnější rozpis operace načítání, vyfiltrujte zobrazení událostí v ResolutionAttempted seznamu Microsoft-Windows-DotNETRuntime/AssemblyLoader událostí na levé straně. Přidejte sloupce AssemblyNamea StageResult do zobrazení. Vyfiltrujte události s ID aktivity z Start/Stop dvojice.

PerfView ResolutionAttempted events image

Název události Assemblyname Fáze Výsledek
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

Výše uvedené události značí, že se zavaděč sestavení pokusil vyřešit vyhledáním aktuálního kontextu zatížení, spuštěním výchozí logiky sondování pro sestavení spravovaných aplikací, vyvoláním obslužných rutin pro událost a vyvoláním obslužných rutin pro danou AssemblyLoadContext.ResolvingAppDomain.AssemblyResolveudálost . Pro všechny tyto kroky se sestavení nenašlo.

Rozšiřující body

Pokud chcete zjistit, které body rozšíření byly vyvolány, vyfiltrujte zobrazení na AssemblyLoadContextResolvingHandlerInvoked seznam událostí vlevo a AppDomainAssemblyResolveHandlerInvoked v části Microsoft-Windows-DotNETRuntime/AssemblyLoader . Přidejte sloupce AssemblyName a HandlerName do zobrazení. Vyfiltrujte události s ID aktivity z Start/Stop dvojice.

PerfView extension point events image

Název události Assemblyname Název obslužné rutiny
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked MyLibrary, Culture=neutral, PublicKeyToken=null OnAssemblyLoadContextResolving
AssemblyLoader/AppDomainAssemblyResolveHandlerInvoked MyLibrary, Culture=neutral, PublicKeyToken=null OnAppDomainAssemblyResolve

Výše uvedené události naznačují, že obslužná rutina byla OnAssemblyLoadContextResolving vyvolána pro AssemblyLoadContext.Resolving událost a obslužná rutina byla OnAppDomainAssemblyResolve vyvolána pro AppDomain.AssemblyResolve událost.

Shromáždění dalšího trasování

Spusťte aplikaci s argumenty tak, aby její obslužná rutina události AssemblyLoadContext.Resolving načetla MyLibrary sestavení.

AssemblyLoading /d default alc-resolving

Shromážděte a otevřete jiný .nettrace soubor pomocí výše uvedených kroků.

Znovu vyfiltrujte Start události a Stop události MyLibrary . Měli byste vidět pár s jinou Start//StopStartStop mezi nimi. Vnitřní operace zatížení představuje zatížení aktivované obslužnou rutinou při AssemblyLoadContext.Resolving jeho zavolání AssemblyLoadContext.LoadFromAssemblyPath. Tentokrát byste se měli podívat Success=True na Stop událost, což znamená, že operace načítání proběhla úspěšně. Pole ResultAssemblyPath zobrazuje cestu výsledného sestavení.

PerfView successful Start and Stop events image

Název události Assemblyname ActivityID Success 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/ True C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll
AssemblyLoader/Stop MyLibrary, Culture=neutral, PublicKeyToken=null 1/2/ True C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll

Pak se můžeme podívat na ResolutionAttempted události s ID aktivity z vnějšího zatížení a určit krok, ve kterém bylo sestavení úspěšně vyřešeno. Tentokrát události ukážou AssemblyLoadContextResolvingEvent , že fáze byla úspěšná. Pole ResultAssemblyPath zobrazuje cestu výsledného sestavení.

PerfView successful ResolutionAttempted events image

Název události Assemblyname Fáze Výsledek 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

Při pohledu na AssemblyLoadContextResolvingHandlerInvoked události se zobrazí, že byla vyvolána obslužná OnAssemblyLoadContextResolving rutina. Pole ResultAssemblyPath zobrazuje cestu sestavení vrácené obslužnou rutinou.

PerfView successful extension point events image

Název události Assemblyname Název obslužné rutiny ResultAssemblyPath
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked MyLibrary, Culture=neutral, PublicKeyToken=null OnAssemblyLoadContextResolving C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll

Všimněte si, že již ResolutionAttempted neexistuje událost s AppDomainAssemblyResolveEvent fází ani žádné AppDomainAssemblyResolveHandlerInvoked události, protože sestavení bylo úspěšně načteno před dosažením kroku algoritmu načítání, který vyvolá AppDomain.AssemblyResolve událost.

Viz také