Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A holtpont-észlelés figyeli az illesztőprogram által használt, zárolást igénylő erőforrásokat – spinlockokat, mutexeket és gyors mutexeket. Ez az Illesztőprogram-ellenőrző beállítás észleli a kódlogikát, amely egy későbbi időpontban holtpontot okozhat.
A Driver Verifier Holtpont-észlelési lehetősége és a !holtpont kernel hibakereső bővítménye hatékony eszköz annak biztosítására, hogy a kód elkerülje ezeknek az erőforrásoknak a rossz használatát.
A holtpontészlelés csak a Windows XP és a Windows újabb verzióiban támogatott.
Holtpontok okai
Holtpontot akkor okoz, ha két vagy több szál ütközik egy erőforrással, oly módon, hogy a végrehajtás nem lehetséges.
A holtpont leggyakoribb formája akkor fordul elő, ha két vagy több szál várakozik a másik szál tulajdonában lévő erőforrásra. Ezt a következőképpen szemléltetjük:
| Szál 1 | Szál 2 |
|---|---|
| Az A zárolást veszi igénybe | Felveszi a B zárolást |
| Kérések zárolása B | Kérés: Zár A |
Ha mindkét művelet egyszerre történik, az 1. szál soha nem kapja meg Lock B-t, mert azt a 2. szál birtokolja, és a 2. szál soha nem kapja meg Lock A-t, mert az 1. szál birtokolja. A legjobb esetben ez az érintett szálak leállását, legrosszabb esetben pedig a rendszer leállását okozza.
A holtpontok nem korlátozódnak két szálra és két erőforrásra. A három szál és a három zár közötti háromirányú holtpontok gyakoriak , és esetenként akár öt- vagy hatrészes holtpontok is előfordulnak. Ezek a holtpontok bizonyos fokú "balszerencsét" igényelnek, mivel számos dologra támaszkodnak, amelyek egyidejűleg történnek. Azonban minél távolabb vannak a zárolások megszerzései, annál valószínűbbé válnak ezek.
A holtpont akkor fordulhat elő, ha egy szál megkísérli a zárolás megszerzését, amelyet már birtokol.
Az összes holtpont közös nevezője, hogy a zárolási hierarchiát nem tartják tiszteletben. Amikor egyszerre több zár megszerzésére van szükség, minden zárnak világos sorrendet kell követnie. Ha az A a B elé kerül egy ponton, a B pedig a C elé, akkor a hierarchia A-B-C. Ez azt jelenti, hogy az A-t soha nem szabad B vagy C után beszerezni, a B pedig nem szerezhető be C után.
A zárolási hierarchiát akkor is követni kell, ha nincs lehetőség holtpontra, mivel a kód karbantartása során könnyen előfordulhat, hogy véletlenül holtpont kerül bevezetésre.
Holtpontot okozó erőforrások
A legérthetetlenebb holtpontok a saját erőforrások eredményei. Ezek közé tartoznak a spin lockok, a mutexek, a gyors mutexek és az ERESOURCE.
A nem beszerzett erőforrások (például események és LPC-portok) sokkal egyértelműbb holtpontokat okoznak. Természetesen lehetséges és meglehetősen gyakori, hogy a kód nem megfelelően használja ezeket az erőforrásokat oly módon, hogy két szál határozatlan ideig várjon egymás befejezésére. Mivel azonban ezek az erőforrások valójában nem egyetlen szál tulajdonában vannak, nem lehet azonosítani a delinquent szálat bármilyen bizonyossággal.
A Driver Verifier holtpontészlelési lehetősége keresi a potenciális holtpontokat, amelyek spin lockokat, mutexeket és gyors mutexeket foglalnak magukban. Nem figyeli az ERESOURC-k használatát, és nem figyeli a nem tulajdonolt erőforrások használatát sem.
Holtpont-észlelés hatásai
Az illesztőprogram-ellenőrző zárolási holtpont-észlelési rutinjai olyan hierarchia-szabálysértéseket találnak, amelyek nem feltétlenül egyszerre fordulnak elő. Ezek a szabálysértések legtöbbször olyan kódútvonalakat azonosítanak, amelyek holtpontra kerülnek, ha lehetőséget adnak rá.
A lehetséges holtpontok megkereséséhez az Illesztőprogram-ellenőrző létrehoz egy erőforrás-beszerzési sorrendet ábrázoló grafikont, és ellenőrzi a hurkokat. Ha minden erőforráshoz létre szeretne hozni egy csomópontot, és egy nyilat rajzolna, amikor egy zárolást egy másik előtt szerez be, akkor az elérésiút-hurkok a zárolási hierarchia megsértését jelölik.
Az illesztőprogram-ellenőrző hibaellenőrzést ad ki, ha az egyik szabálysértést észleli. Ez a tényleges holtpontok bekövetkezése előtt következik be.
Megjegyzés:
Még ha az ütköző kód elérési útjai nem is fordulnak elő egyidejűleg, akkor is újra kell őket írni, ha zárolási hierarchiák megsértésével járnak. Az ilyen kód egy "holtpont, amely arra vár, hogy megtörténjen", ami valós holtpontot okozhat, ha a kód kissé újra van írva.
Amikor a holtpont-észlelés szabálysértést talál, hibakódot ad ki: 0xC4. A hibaellenőrzés első paramétere a pontos szabálysértést jelzi. Lehetséges szabálysértések a következők:
Két vagy több szál vesz részt egy zárolási hierarchia megsértésében.
Egy szál, amely megpróbál kizárólagos tulajdonossá válni egy olyan erőforrás felett, amelynek már megosztott tulajdonosa. A kizárólagos tulajdonban lévő erőforrások megosztva is megszerezhetők; a megosztott erőforrások azonban nem szerezhetők meg kizárólagos módon.
Egy szál, amely kétszer próbálja megszerezni ugyanazt az erőforrást (önkiszolgáló holtpont)
Az első beolvasás nélkül kiadott erőforrás
Olyan erőforrás, amelyet egy másik szál bocsát ki, mint az azt beszerző.
Olyan erőforrás, amely többször inicializálva van, vagy egyáltalán nem inicializálódik
Egy olyan szál, amely törölve van, miközben továbbra is rendelkezik erőforrásokkal
A Windows 7-től kezdődően az Illesztőprogram-ellenőrző előre tudja jelezni a lehetséges holtpontokat. Például ugyanazt a KSPIN_LOCK adatstruktúrát próbálja használni, mint egy normál pörgetési zárolást és egy sorba sorba állított pörgetési zárolást.
Lásd a Hibaellenőrzés 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) című témakört a hibaellenőrzési paraméterek listájáért.
Holtpont észlelésének monitorozása
Miután a Holtpont észlelése szabálysértést talált, a !holtpont kernel hibakereső bővítményével pontosan meg lehet vizsgálni, hogy mi történt. Megjelenítheti a zárolási hierarchia topológiát, valamint az egyes szálak hívási vermeit a zárolások eredeti beszerzésekor.
A !holtpont bővítményre, valamint a hibakereső bővítményekkel kapcsolatos általános információkra részletes példa található a Windows hibakeresési eszközei csomag dokumentációjában. A részleteket a Windows hibakeresése című témakörben találja.
A beállítás aktiválása
Megjegyzés:
Ez a beállítás nem kompatibilis a Kernel szinkronizálási késleltetés fuzzing funkcióval.
Egy vagy több illesztőprogram holtpont-észlelési funkcióját az Illesztőprogram-ellenőrzőkezelő vagy a Verifier.exe parancssor használatával aktiválhatja. További részletekért lásd: Illesztőprogram-ellenőrző beállításainak kiválasztása.
A parancssorban
A parancssorban a Holtpont észlelése lehetőséget az 5. bit (0x20) jelöli. A Holtpont-észlelés aktiválásához használjon egy 0x20 jelzőértéket, vagy adjon hozzá 0x20 a jelző értékéhez. Például:
verifier /flags 0x20 /driver MyDriver.sysA funkció a következő rendszerindítás után aktív lesz.
A Windows Vista és a Windows újabb verzióiban is aktiválhatja és inaktiválhatja a Holtpont-észlelést a számítógép újraindítása nélkül, ha hozzáadja a /volatile paramétert a parancshoz. Például:
verifier /volatile /flags 0x20 /adddriver MyDriver.sysEz a beállítás azonnal érvénybe lép, de a számítógép leállítása vagy újraindításakor elveszik. További részletekért lásd Illékony beállítások használata.
A holtpontészlelési funkció a szokásos beállításokban is megtalálható. Például:
verifier /standard /driver MyDriver.sysDriver Verifier Manager használata
Válassza az Egyéni beállítások létrehozása (kódfejlesztők számára), majd a Tovább gombot.
Válassza Egyéni beállítások kiválasztása a teljes listából.
Válassza ki (ellenőrizze) a holtpont észlelését.
A holtpontészlelési funkció a szokásos beállításokban is megtalálható. A funkció használatához az Driver Verifier Managerben válassza a Standard beállítások létrehozása lehetőséget.