loaderLock MDA
Feljegyzés
Ez a cikk a .NET-keretrendszer vonatkozik. Ez nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.
A loaderLock
felügyelt hibakeresési segéd (MDA) észleli a felügyelt kód végrehajtására tett kísérleteket egy olyan szálon, amely a Microsoft Windows operációs rendszer betöltőzárát tárolja. Minden ilyen végrehajtás illegális, mert holtpontokhoz és DLL-ek használatához vezethet, mielőtt az operációs rendszer betöltője inicializálná őket.
Hibajelenségek
Az operációs rendszer rakodózárán belüli kód végrehajtásakor a leggyakoribb hiba az, hogy a szálak holtpontra kerülnek, amikor más Win32-függvényeket próbálnak meghívni, amelyekhez a betöltőzár is szükséges. Ilyen függvények például a LoadLibrary
következők: , FreeLibrary
GetProcAddress
és GetModuleHandle
. Előfordulhat, hogy az alkalmazás nem hívja meg közvetlenül ezeket a függvényeket; a közös nyelvi futtatókörnyezet (CLR) egy magasabb szintű hívás, vagy Load egy platformhívási metódus első hívása eredményeként hívhatja meg ezeket a függvényeket.
Holtpontok akkor is előfordulhatnak, ha egy szál egy másik szál indítására vagy befejezésére vár. Amikor egy szál elindul vagy befejezi a végrehajtást, be kell szereznie az operációs rendszer rakodózárát, hogy eseményeket kézbesítsen az érintett DLL-ekhez.
Végül vannak olyan esetek, amikor a DLL-be irányuló hívások még azelőtt fordulhatnak elő, hogy az operációs rendszer betöltője megfelelően inicializálta volna ezeket a DLL-eket. Ellentétben a holtpont hibáival, amelyek diagnosztizálhatók a holtpontban részt vevő összes szál veremének vizsgálatával, nagyon nehéz diagnosztizálni a nem inicializált DLL-k használatát az MDA használata nélkül.
Ok
A .NET-keretrendszer 1.0 vagy 1.1 verzióhoz készült vegyes felügyelt/nem felügyelt C++ szerelvények általában megpróbálják végrehajtani a felügyelt kódot a rakodózáron belül, kivéve, ha különös figyelmet fordítanak például a /NOENTRY-hez való kapcsolódásra.
A .NET-keretrendszer 2.0-s verziójához készült vegyes felügyelt/nem felügyelt C++ szerelvények kevésbé érzékenyek ezekre a problémákra, és ugyanolyan kockázattal járnak, mint az operációs rendszer szabályait megsértő, nem felügyelt DLL-eket használó alkalmazások. Ha például egy nem felügyelt DLL DllMain
belépési pontja egy COM-nak közzétett felügyelt objektum lekérésére hívja CoCreateInstance
meg, az eredmény egy felügyelt kód végrehajtására tett kísérlet a betöltőzáron belül. A .NET-keretrendszer 2.0-s és újabb verziójával kapcsolatos rakodózárolási problémákról további információt a Vegyes szerelvények inicializálása című témakörben talál.
Resolution (Osztás)
A Visual C++ .NET 2002-ben és a Visual C++ .NET 2003-ban a fordítóval lefordított /clr
DLL-ek nem determinisztikusan holtpontot jelenthetnek betöltésekor; ezt a problémát vegyes DLL-betöltési vagy betöltőzárolási problémának nevezték. A Visual C++ 2005-ös és újabb verzióiban szinte minden nem determinizmus el lett távolítva a vegyes DLL betöltési folyamatból. Van azonban néhány további forgatókönyv, amelyek esetében a rakodózár (determinisztikusan) bekövetkezhet. A fennmaradó rakodózárolási problémák okainak és megoldásainak részletes ismertetése: Vegyes szerelvények inicializálása. Ha ez a témakör nem azonosítja a betöltőzárolási problémát, meg kell vizsgálnia a szál veremét annak megállapításához, hogy miért történik a betöltő zárolása, és hogyan háríthatja el a problémát. Tekintse meg az MDA-t aktiváló szál veremkövetését. A szál illegálisan próbál betárcsázást kezdeményezni a felügyelt kódba, miközben az operációs rendszer betöltőzárát tartja. Valószínűleg megjelenik egy DLL DllMain
vagy azzal egyenértékű belépési pont a veremen. Az operációs rendszer azon szabályai, amelyeket legálisan tehet egy ilyen belépési ponton belülről, meglehetősen korlátozottak. Ezek a szabályok kizárják a felügyelt végrehajtást.
Effektus a futtatókörnyezetre
A folyamaton belül általában több szál is holtpontra kerül. Az egyik ilyen szál valószínűleg egy szemétgyűjtés végrehajtásáért felelős szál, így ez a holtpont jelentős hatással lehet a teljes folyamatra. Emellett megakadályozza az operációs rendszer rakodózárát igénylő további műveleteket, például szerelvények vagy DLL-ek be- és kirakodását, valamint a szálak indítását vagy leállítását.
Néhány szokatlan esetben előfordulhat, hogy a hozzáférési szabálysértések vagy hasonló problémák is aktiválódhatnak az inicializálás előtt meghívott DLL-ekben.
Hozam
Ez az MDA azt jelenti, hogy illegálisan felügyelt végrehajtást kíséreltek meg. Meg kell vizsgálnia a szál veremét annak megállapításához, hogy miért történik a rakodózár, és hogyan lehet kijavítani a problémát.
Konfiguráció
<mdaConfig>
<assistants>
<loaderLock/>
</assistants>
</mdaConfig>