Részletes szerelvénybetöltési információk gyűjtése

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

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-io kapcsolót a stdin és a stdout interakciójához.
  • Az eszközből való kilépés a Ctrl+C billentyűkombinációval vagy a SIGTERM biztonsá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

  1. 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 build
    
  2. Indí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 default
    
  3. Keresse meg az alkalmazás folyamatazonosítóját.

    dotnet-trace ps
    

    A kimenet felsorolja az elérhető folyamatokat. Például:

    35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exe
    
  4. Csatolja dotnet-trace a futó alkalmazáshoz.

    dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
    
  5. Az 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.

PerfView Assembly Loader szűrőkép

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.

PerfView indítás és leállítás eseményeinek ábrája

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.

PerfView ResolutionAttempted események képe

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.

A PerfView bővítménypont eseményeinek képe

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.

PerfView sikeres indítási és leállítási események képe

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.

PerfView sikeresen végrehajtott ResolutionAttempted események képe

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.

A PerfView sikeres bővítménypont eseményeinek képe

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.

Lásd még