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-DotNETRuntime
AssemblyLoader
(0x4
).
Požadavky
- Sada .NET 5 SDK nebo novější verze
dotnet-trace
Nástroj
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-trace
naleznete 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 jehostdin
astdout
. - 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í
Přejděte do adresáře s staženou ukázkou. Sestavte aplikaci pomocí:
dotnet build
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
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
Připojte
dotnet-trace
se ke spuštěné aplikaci.dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
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.
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é – MyLibrary
můž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 AssemblyName
a ActivityID
Success
do zobrazení. Filtrovat podle událostí obsahujících MyLibrary
.
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 Stop
Success=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 AssemblyName
a Stage
Result
do zobrazení. Vyfiltrujte události s ID aktivity z Start
/Stop
dvojice.
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.Resolving AppDomain.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.
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
//Stop
Start
Stop
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í.
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í.
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.
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.