Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A .NET 5-tel kezdődően a futtatókörnyezet képes eseményeket kibocsátani EventPipe a felügyelt szerelvénybetöltéssel kapcsolatos részletes információkkal a szerelvénybetöltési problémák diagnosztizálásához. Ezeket az eseményeket a Microsoft-Windows-DotNETRuntime szolgáltató bocsátja ki a AssemblyLoader (0x4) kulcsszó alatt.
Előfeltételek
- .NET 5 SDK vagy újabb verziók
-
dotnet-traceeszköz
Megjegyzés:
A képességek hatóköre dotnet-trace nagyobb, mint a részletes szerelvénybetöltési információk gyűjtése. A használattal dotnet-tracekapcsolatos további információkért lásd dotnet-trace: .
Gyűjtsön nyomkövetést szerelvénybetöltési eseményekkel
Egy meglévő folyamat nyomon követésére vagy egy gyermekfolyamat elindítására és az indításból való nyomon követésére használható dotnet-trace .
Meglévő folyamat nyomon követése
Ha engedélyezni szeretné a szerelvény betöltési eseményeit a futtatókörnyezetben, és nyomon szeretné követni őket, használja dotnet-trace a következő parancsot:
dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id <pid>
Ez a parancs összegyűjti a megadott <pid> nyomkövetést, ezzel engedélyezve az AssemblyLoader eseményeket a Microsoft-Windows-DotNETRuntime szolgáltatónál. Az eredmény egy .nettrace fájl.
A dotnet-trace használatával elindíthat egy gyermekfolyamatot, és nyomon követheti azt indításkor
Néha hasznos lehet egy folyamat nyomának összegyűjtése az indításból. A .NET 5-ös vagy újabb verzióját futtató alkalmazások esetében ezt használhatja dotnet-trace .
A következő parancs elindítja a hello.exe parancsot, arg1 és arg2 mint parancssori argumentumokkal, és gyűjti az indítási nyomkövetést a futtatási idő elindulásakor.
dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 -- hello.exe arg1 arg2
Az Enter vagy a Ctrl + C lenyomásával leállíthatja a nyomkövetést. Ezzel bezárja hello.exe-t is.
Megjegyzés:
- A hello.exe indítása átirányítja a bemenetet és a kimenetet
dotnet-trace, ami miatt alapértelmezés szerint nem fog tudni vele a konzolon kapcsolatba lépni. Használja a--show-child-iokapcsolót astdinés astdoutinterakciójához. - Az eszközből való kilépés a Ctrl+C billentyűkombinációval vagy a
SIGTERMbiztonságos lezárással mind az eszközt, mind a gyermekfolyamatot lezárja. - Ha a gyermekfolyamat az eszköz előtt kilép, az eszköz is kilép, és a nyomkövetésnek biztonságosan megtekinthetőnek kell lennie.
Nyomkövetés megtekintése
Az összegyűjtött nyomkövetési fájl Windows rendszeren a PerfView Események nézetével tekinthető meg. A rendszer az összes szerelvénybetöltési eseményt előtaggal nyitja Microsoft-Windows-DotNETRuntime/AssemblyLoadermeg.
Példa (Windows rendszeren)
Ez a példa a szerelvénybetöltési bővítménypontok mintáját használja. Az alkalmazás megpróbál betölteni egy szerelvényt MyLibrary – egy olyan szerelvényt, amelyre az alkalmazás nem hivatkozik, és ezért a szerelvénybetöltési bővítményponton való kezelés sikeres betöltését igényli.
Nyom összegyűjtése
Lépjen a könyvtárba, amely tartalmazza a letöltött mintát. Az alkalmazás létrehozása a következőkkel:
dotnet buildIndítsa el az alkalmazást olyan argumentumokkal, amelyek azt jelzik, hogy szüneteltetnie kell, és a billentyű lenyomására kell várnia. Az újrapróbálkozáskor megkísérli betölteni a szerelvényt az alapértelmezett
AssemblyLoadContextértéken – a sikeres terheléshez szükséges kezelés nélkül. Lépjen a kimeneti könyvtárra, és futtassa a következőt:AssemblyLoading.exe /d defaultKeresse meg az alkalmazás folyamatazonosítóját.
dotnet-trace psA kimenet felsorolja az elérhető folyamatokat. Például:
35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exeCsatolja
dotnet-tracea futó alkalmazáshoz.dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832Az alkalmazást futtató ablakban nyomja le bármelyik billentyűt a program folytatásához. A nyomkövetés automatikusan leáll, amint az alkalmazás kilép.
A nyomkövetés megtekintése
Nyissa meg az összegyűjtött nyomkövetést a PerfView-ban , és nyissa meg az Események nézetet. Szűrje az eseménylistát a Microsoft-Windows-DotNETRuntime/AssemblyLoader eseményekre.
Megjelenik az alkalmazásban a nyomkövetés elindítása után történt összes szerelvénybetöltés. A példa szempontjából fontos szerelvény MyLibrary terhelési műveletének vizsgálatához, további szűrőfeltételek alkalmazhatók.
Szerelvénybetöltések
Szűrje a nézetet azokra Start és Stop eseményekre Microsoft-Windows-DotNETRuntime/AssemblyLoader a bal oldali eseménylista használatával. Adja hozzá az oszlopokat AssemblyName, ActivityID és Success a nézethez. Szűrés a MyLibrary-et tartalmazó eseményekre.
| Esemény neve | AssemblyName | Tevékenységazonosító | (No changes required, the translation remains "Siker.") |
|---|---|---|---|
AssemblyLoader/Start |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | |
AssemblyLoader/Stop |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | Téves |
Az eseményen Start egy /StopSuccess=False párnak Stop kell megjelennie, ami azt jelzi, hogy a terhelési művelet nem sikerült. Vegye figyelembe, hogy a két esemény ugyanazzal a tevékenységazonosítóval rendelkezik. A tevékenységazonosítóval az összes többi szerelvénybetöltő eseményt szűrheti a terhelési műveletnek megfelelőre.
A betöltési kísérlet lebontása
A terhelési művelet részletesebb lebontásához szűrje a nézetet az ResolutionAttempted eseményekre a bal oldalon található Microsoft-Windows-DotNETRuntime/AssemblyLoader eseménylista használatával. Adja hozzá az oszlopokat AssemblyName, Stage és Result a nézethez. Szűrés a pár tevékenységazonosítójával Start/Stop rendelkező eseményekre.
| Esemény neve | AssemblyName | Színpad | Eredmény |
|---|---|---|---|
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 |
A fenti események azt jelzik, hogy a betöltési logika megpróbálta feloldani a szerelvényt az aktuális betöltési környezetben, futtatva a felügyelt alkalmazásszerelvények alapértelmezett vizsgálati logikáját, és meghívva az AssemblyLoadContext.Resolving esemény, valamint az AppDomain.AssemblyResolve esemény kezelőit. Az összes ilyen lépés esetében a szerelvény nem található.
Bővítési pontok
Annak megtekintéséhez, hogy mely bővítménypontokat hívták meg, szűrje a nézetet a bal oldali eseménylista használatával a AssemblyLoadContextResolvingHandlerInvoked és AppDomainAssemblyResolveHandlerInvoked alatt a Microsoft-Windows-DotNETRuntime/AssemblyLoader alatt. Adja hozzá az oszlopokat AssemblyName és HandlerName a nézethez. Szűrés a pár tevékenységazonosítójával Start/Stop rendelkező eseményekre.
| Esemény neve | AssemblyName | HandlerName |
|---|---|---|
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAssemblyLoadContextResolving |
AssemblyLoader/AppDomainAssemblyResolveHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAppDomainAssemblyResolve |
A fenti események azt jelzik, hogy egy elnevezett OnAssemblyLoadContextResolving kezelőt hívtak meg az AssemblyLoadContext.Resolving eseményhez, és egy elnevezett OnAppDomainAssemblyResolve kezelőt hívtak meg az AppDomain.AssemblyResolve eseményhez.
Újabb nyom összegyűjtése
Futtassa az alkalmazást úgy, hogy az AssemblyLoadContext.Resolving esemény kezelője betöltse a MyLibrary szerelvényt argumentumokkal.
AssemblyLoading /d default alc-resolving
Gyűjtsön össze és nyisson meg egy másik .nettrace fájlt a fenti lépésekkel.
Szűrje újra az Start és Stop eseményekre, a MyLibrary szerint. Meg kell jelennie egy Start/Stop párnak egy másikkal Start/Stop közöttük. A belső terhelési művelet azt a terhelést jelöli, amelyet a kezelő AssemblyLoadContext.Resolving aktivált, amikor meghívta AssemblyLoadContext.LoadFromAssemblyPath. Ezúttal az Success=True eseményen kell megjelennieStop, jelezve, hogy a terhelési művelet sikeres volt. A ResultAssemblyPath mező az eredményként kapott szerelvény elérési útját jeleníti meg.
| Esemény neve | AssemblyName | Tevékenységazonosító | (No changes required, the translation remains "Siker.") | EredményÖsszeállításÚtvonala |
|---|---|---|---|---|
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/ | Igaz | C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
AssemblyLoader/Stop |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | Igaz | C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
Ezután megvizsgálhatjuk az ResolutionAttempted eseményeket a külső terhelés tevékenységazonosítójával annak meghatározásához, hogy a szerelvény sikeres feloldása milyen lépésben történt. Ezúttal az események azt mutatják, hogy a AssemblyLoadContextResolvingEvent szakasz sikeres volt. A ResultAssemblyPath mező az eredményként kapott szerelvény elérési útját jeleníti meg.
| Esemény neve | AssemblyName | Színpad | Eredmény | EredményÖsszeállításÚtvonala |
|---|---|---|---|---|
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 |
AssemblyLoadContextResolvingHandlerInvoked események megtekintése azt mutatja, hogy a OnAssemblyLoadContextResolving nevű kezelőt meghívták. A ResultAssemblyPath mező a kezelő által visszaadott szerelvény elérési útját jeleníti meg.
| Esemény neve | AssemblyName | HandlerName | EredményÖsszeállításÚtvonala |
|---|---|---|---|
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAssemblyLoadContextResolving |
C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
Vegye figyelembe, hogy már nincsenek ResolutionAttempted események a AppDomainAssemblyResolveEvent fázissal vagy AppDomainAssemblyResolveHandlerInvoked események, mivel a szerelvény sikeresen be lett töltve, még mielőtt elérte volna a betöltési algoritmusnak a AppDomain.AssemblyResolve eseményt kiváltó lépését.