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

Počínaje verzí .NET 5 může modul runtime generovat události prostřednictvím EventPipe s podrobnými informacemi o načítání spravovaných sestavení, aby pomohl při diagnostice problémů s načítáním sestavení. Poskytovatel generuje tyto události pod klíčovým slovem Microsoft-Windows-DotNETRuntimeAssemblyLoader (0x4).

Požadavky

Poznámka:

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

Zaznamenejte trasu 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>, čímž povoluje události AssemblyLoader ve zprostředkovateli Microsoft-Windows-DotNETRuntime. Výsledkem je .nettrace soubor.

Použijte dotnet-trace ke spuštění dceřiného procesu a jeho sledování od začátku

Někdy může být užitečné získat 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 jako své argumenty příkazového řádku a shromáždí trasování ze spuštění modulu runtime pomocí arg2.

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 prostřednictvím dotnet-trace přesměruje jeho vstup a výstup, takže ve výchozím nastavení s ním nebudete moct pracovat v konzoli. Přepínač --show-child-io použijte pro interakci s jeho stdin a stdout.
  • Bezpečné ukončení nástroje pomocí Ctrl+C nebo SIGTERM bezpečně ukončí jak nástroj, tak i podřízený proces.
  • Pokud by podřízený proces skončil před nástrojem, nástroj by také skončil a trasování by mělo být bezpečně zobrazitelné.

Zobrazit trasování

Shromážděný trasovací soubor lze zobrazit ve Windows pomocí zobrazení Události v nástroji PerfView. Všechny události při 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í MyLibrary – sestavení, na které aplikace neodkazuje, a proto je třeba využít zpracování v bodu rozšíření načítání sestavení, aby bylo úspěšně načteno.

Sbírat 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ů. Například:

    35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exe
    
  4. Připojte dotnet-trace 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í.

Prohlédnout si trasování

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

Obrázek filtru zavaděče sestavení PerfView

Zobrazí se všechna sestavení načtená v aplikaci po zahájení trasování. Abychom zkontrolovali operaci načítání pro sestavení, které je pro tento příklad zajímavé, MyLibrary, můžeme provést další filtrování.

Načítání sestavení

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

Obrázek událostí Spuštění a zastavení nástroje PerfView

Název události Název Sestavení ID aktivity Úspěch
AssemblyLoader/Start MyLibrary, Culture=neutral, PublicKeyToken=null //1/2/
AssemblyLoader/Stop MyLibrary, Culture=neutral, PublicKeyToken=null //1/2/ Nepravda

V události by se měla zobrazit jedna Start/Stop dvojice Success=FalseStop, 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 pro filtrování všech ostatních událostí návrhu zavaděče 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í na ResolutionAttempted události pod Microsoft-Windows-DotNETRuntime/AssemblyLoader pomocí seznamu událostí na levé straně. Přidejte sloupce AssemblyNamea StageResult do zobrazení. Vyfiltrujte události s ID aktivity z Start/Stop dvojice.

Obrázek událostí PerfView ResolutionAttempted

Název události Název Sestavení Etapa 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 naznačují, že se zavaděč sestavení pokusil vyřešit sestavení vyhledáním v aktuálním kontextu načítání, spuštěním výchozí logiky sondování pro sestavení spravovaných aplikací, vyvoláním obslužných rutin pro událost AssemblyLoadContext.Resolving a vyvoláním obslužných rutin pro událost AppDomain.AssemblyResolve. Pro všechny tyto kroky nebylo sestavení nalezeno.

Body rozšíření

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

Obrázek událostí rozšiřovacího bodu PerfView

Název události Název Sestavení 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áždit další stopu

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 události pro Start a Stop pro MyLibrary. Měli byste vidět pár Start/Stop s dalšími Start/Stop mezi nimi. Vnitřní operace zatížení představuje zatížení aktivované obslužným procesem pro AssemblyLoadContext.Resolving když zavolal AssemblyLoadContext.LoadFromAssemblyPath. Tentokrát byste měli vidět Success=True na události Stop, což značí, že operace načítání byla úspěšná. Pole ResultAssemblyPath zobrazuje cestu výsledného sestavení.

Obrázek úspěšných událostí začátku a konce PerfView

Název události Název Sestavení ID aktivity Úspěch 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/ Pravdivé C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll
AssemblyLoader/Stop MyLibrary, Culture=neutral, PublicKeyToken=null //1/2/ Pravdivé 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, že AssemblyLoadContextResolvingEvent fáze byla úspěšná. Pole ResultAssemblyPath zobrazuje cestu výsledného sestavení.

Obrázek úspěšných událostí typu ResolutionAttempted v PerfView

Název události Název Sestavení Etapa 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 obsluha OnAssemblyLoadContextResolving vyvolána. Pole ResultAssemblyPath zobrazuje cestu sestavení, kterou obslužná rutina vrací.

Obrázek úspěšných událostí bodu rozšíření PerfView

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

Pamatujte, že už neexistuje událost s fází ResolutionAttempted ani žádné události AppDomainAssemblyResolveEvent, protože sestavení bylo úspěšně načteno před dosažením kroku načítacího algoritmu, který vyvolá událost AppDomainAssemblyResolveHandlerInvoked.

Viz také