Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
- .NET 5 SDK nebo novější verze
-
dotnet-tracenástroj
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-tracepř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-iopoužijte pro interakci s jehostdinastdout. - Bezpečné ukončení nástroje pomocí Ctrl+C nebo
SIGTERMbezpeč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í
Přejděte do adresáře s staženou ukázkou. Sestavte aplikaci pomocí:
dotnet buildSpusť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í
AssemblyLoadContextbez 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 defaultVyhledejte ID procesu aplikace.
dotnet-trace psVýstup zobrazí seznam dostupných procesů. Například:
35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exePřipojte
dotnet-traceke spuštěné aplikaci.dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832V 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í.
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.
| 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.
| 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.
| 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í.
| 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í.
| 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í.
| 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.