Megosztás a következőn keresztül:


Események hibakeresése

A hibakeresési esemény a hibakeresési folyamat olyan incidense, amely miatt a rendszer értesíti a hibakeresőt. A hibakeresési események közé tartozik egy folyamat létrehozása, egy szál létrehozása, egy dinamikus csatolású kódtár (DLL) betöltése, egy DLL eltávolítása, egy kimeneti sztring küldése és egy kivétel létrehozása.

Ha hibakeresési esemény történik, miközben egy hibakereső várakozik rá, a rendszer kitölti a WaitForDebugEvent által megadott DEBUG_EVENT struktúrát az eseményt leíró információkkal.

Amikor a rendszer értesíti a hibakeresési esemény hibakeresőit, az is felfüggeszti az érintett folyamat összes szálát. A szálak nem folytatják a végrehajtást, amíg a hibakereső nem folytatja a hibakeresési eseményt ContinueDebugEventhasználatával. A folyamat hibakeresése során az alábbi hibakeresési események fordulhatnak elő.

Hibakeresési esemény Leírás
CREATE_PROCESS_DEBUG_EVENT
Akkor jön létre, amikor új folyamat jön létre a hibakeresés alatt álló folyamatban, vagy amikor a hibakereső elkezdi a már aktív folyamat hibakeresését. A rendszer ezt a hibakeresési eseményt azelőtt hozza létre, hogy a folyamat felhasználói módban kezdene futni, és mielőtt a rendszer bármilyen más hibakeresési eseményt hoz létre az új folyamathoz.
A DEBUG_EVENT szerkezet CREATE_PROCESS_DEBUG_INFO struktúrát tartalmaz. Ez a struktúra tartalmazza az új folyamat leíróját, a folyamat képfájljának leíróját, a folyamat kezdeti szálához tartozó fogópontot és az új folyamatot leíró egyéb információkat.
A folyamat leírója PROCESS_VM_READ és PROCESS_VM_WRITE hozzáféréssel rendelkezik. Ha egy hibakereső ilyen típusú hozzáféréssel rendelkezik egy szálhoz, a ReadProcessMemory és WriteProcessMemory függvény használatával olvashat és írhat a folyamat memóriájába. Ha a rendszer korábban EXIT_PROCESS_DEBUG_EVENT eseményt jelentett, a rendszer bezárja ezt a leírót, amikor a hibakereső meghívja a ContinueDebugEvent függvényt.
A folyamat képfájljának leírója GENERIC_READ hozzáféréssel rendelkezik, és olvasási megosztásra van megnyitva. A hibakeresőnek be kell zárnia ezt a leírót a CREATE_PROCESS_DEBUG_EVENT feldolgozása során.
A folyamat kezdeti szálának leírója THREAD_GET_CONTEXT, THREAD_SET_CONTEXT és THREAD_SUSPEND_RESUME hozzáféréssel rendelkezik a szálhoz. Ha egy hibakereső ilyen típusú hozzáféréssel rendelkezik egy szálhoz, a GetThreadContext és SetThreadContext függvények használatával olvashat és írhat a szálregisztrálásból, és a SuspendThread és ResumeThread függvények használatával felfüggesztheti és folytathatja a szálat. Ha a rendszer korábban EXIT_PROCESS_DEBUG_EVENT eseményt jelentett, a rendszer bezárja ezt a leírót, amikor a hibakereső meghívja a ContinueDebugEvent függvényt.
CREATE_THREAD_DEBUG_EVENT
Akkor jön létre, amikor egy új szálat hoznak létre a hibakeresés alatt álló folyamatban, vagy amikor a hibakereső elkezdi a már aktív folyamat hibakeresését. Ez a hibakeresési esemény az új szál felhasználói módban való végrehajtása előtt jön létre.
A DEBUG_EVENT szerkezet CREATE_THREAD_DEBUG_INFO struktúrát tartalmaz. Ez a struktúra tartalmaz egy fogópontot az új szálhoz és a szál kezdőcíméhez. A fogópont THREAD_GET_CONTEXT, THREAD_SET_CONTEXT és THREAD_SUSPEND_RESUME hozzáféréssel rendelkezik a szálhoz. Ha egy hibakereső ilyen típusú hozzáféréssel rendelkezik egy szálhoz, a GetThreadContext és SetThreadContext függvények használatával olvashat és írhat a szálregisztrálásból, és a SuspendThread és ResumeThread függvények használatával felfüggesztheti és folytathatja a szálat.
Ha a rendszer korábban jelentett egy EXIT_THREAD_DEBUG_EVENT eseményt, a rendszer bezárja a leírót az új szálhoz, amikor a hibakereső meghívja a ContinueDebugEvent függvényt.
EXCEPTION_DEBUG_EVENT
Akkor jön létre, amikor kivétel történik a hibakeresési folyamatban. A lehetséges kivételek közé tartozik a elérhetetlen memória elérése, a töréspont utasításainak végrehajtása, a nullával való osztás megkísérlése vagy a Strukturált kivételkezelés.
A DEBUG_EVENT szerkezet EXCEPTION_DEBUG_INFO struktúrát tartalmaz. Ez a struktúra a hibakeresési eseményt okozó kivételt írja le.
A szokásos kivételfeltételeken kívül további kivételkód is előfordulhat a konzolfolyamat hibakeresése során. A rendszer egy DBG_CONTROL_C kivételkódot hoz létre, amikor a CTRL+C billentyűkombináció be van adva egy olyan konzolfolyamatba, amely a CTRL+C jeleket kezeli, és hibakeresés alatt áll. Ezt a kivételkódot nem az alkalmazásoknak kell kezelnie. Az alkalmazásoknak soha nem szabad kivételkezelőt használniuk a kezeléshez. Ez csak a hibakereső javára van létrehozva, és csak akkor használatos, ha egy hibakereső csatlakozik a konzolfolyamathoz.
Ha egy folyamat nem hibakeresés alatt áll, vagy ha a hibakereső kezeletlenül továbbítja a DBG_CONTROL_C kivételt (a gn paranccsal), a rendszer megkeresi az alkalmazás kezelőfüggvényeinek listáját a SetConsoleCtrlHandlerfüggvénydokumentált módon.
Ha a hibakereső kezeli a DBG_CONTROL_C kivételt (a gh paranccsal), az alkalmazás nem fogja észrevenni a CTRL+C billentyűkombinációt, kivéve az ilyen kódokat.
while ((inputChar = getchar()) != EOF) ...
Így a hibakereső nem használható az ilyen kód olvasási várakozásának leállítására.
EXIT_PROCESS_DEBUG_EVENT
Akkor jön létre, amikor a folyamat utolsó szála hibakeresés alatt áll. Ez a hibakeresési esemény közvetlenül azután következik be, hogy a rendszer kiüríti a folyamat DLL-jeit, és frissíti a folyamat kilépési kódját.
A DEBUG_EVENT struktúra egy EXIT_PROCESS_DEBUG_INFO struktúrát tartalmaz, amely meghatározza a kilépési kódot.
A hibakereső felszabadítja a folyamathoz társított belső struktúrákat a hibakeresési esemény fogadásakor. A rendszer bezárja a hibakereső leíróját a kilépési folyamathoz és a folyamat összes szálához. A hibakeresőnek nem szabad bezárnia ezeket a fogópontokat.
A folyamatleállítás kernel módú része nem fejezhető be, amíg az eseményt fogadó hibakereső nem hívja meg ContinueDebugEvent. Addig a folyamatfogantyúk nyitva vannak, és a virtuális címtér nem szabadul fel, így a hibakereső megvizsgálhatja a gyermekfolyamatot. Ha értesítést szeretne kapni a folyamat leállítása kernel módú részének befejezéséről, duplikálja a CREATE_PROCESS_DEBUG_EVENT visszaadott leírót, hívja meg ContinueDebugEvent, majd várja meg, amíg a duplikált folyamatleírót jelzi.
EXIT_THREAD_DEBUG_EVENT
Akkor jön létre, amikor egy folyamat részét képező szál hibakeresési kilép. A rendszer ezt a hibakeresési eseményt közvetlenül azután hozza létre, hogy frissíti a szál kilépési kódját.
A DEBUG_EVENT struktúra egy EXIT_THREAD_DEBUG_INFO struktúrát tartalmaz, amely meghatározza a kilépési kódot.
Ez a hibakeresési esemény nem fordul elő, ha a kilépési szál egy folyamat utolsó szála. Ebben az esetben a EXIT_PROCESS_DEBUG_EVENT hibakeresési esemény következik be.
A hibakereső felszabadítja a szálhoz társított belső struktúrákat a hibakeresési esemény fogadásakor. A rendszer bezárja a hibakereső leíróját a kilépő szálhoz. A hibakereső nem zárja be ezt a leírót.
LOAD_DLL_DEBUG_EVENT
Akkor jön létre, amikor egy hibakeresés alatt álló folyamat betölt egy DLL-t. Ez a hibakeresési esemény akkor fordul elő, ha a rendszerbetöltő feloldja a DLL-hez való csatolásokat, vagy amikor a hibakeresési folyamat a LoadLibrary függvényt használja. Ez a hibakeresési esemény csak akkor fordul elő, amikor a rendszer először csatol egy DLL-t egy folyamat virtuális címteréhez.
A DEBUG_EVENT szerkezet LOAD_DLL_DEBUG_INFO struktúrát tartalmaz. Ez a struktúra tartalmazza az újonnan betöltött DLL leíróját, a DLL alapcímét és a DLL-t leíró egyéb információkat. A hibakeresőnek le kell zárnia a leírót a DLL-leíróhoz a LOAD_DLL_DEBUG_EVENT feldolgozása során.
A hibakereső általában betölt egy, a DLL-hez társított szimbólumtáblát a hibakeresési esemény fogadásakor.
OUTPUT_DEBUG_STRING_EVENT
Akkor jön létre, amikor egy hibakeresési folyamat a következőt használja:
OutputDebugString függvény. A DEBUG_EVENT szerkezet OUTPUT_DEBUG_STRING_INFO struktúrát tartalmaz. Ez a struktúra a hibakeresési sztring címét, hosszát és formátumát határozza meg.
UNLOAD_DLL_DEBUG_EVENT
Akkor jön létre, amikor egy hibakeresési folyamat eltávolít egy DLL-t a FreeLibrary függvény használatával. Ez a hibakeresési esemény csak akkor fordul elő, amikor egy DLL utoljára törlődik a folyamat címteréből (vagyis amikor a DLL-használat száma nulla).
A DEBUG_EVENT szerkezet UNLOAD_DLL_DEBUG_INFO struktúrát tartalmaz. Ez a struktúra határozza meg a DLL alapcímét a DLL-t kiürítő folyamat címterében.
A hibakereső általában eltávolít egy, a DLL-hez társított szimbólumtáblát a hibakeresési esemény fogadásakor.
Amikor egy folyamat kilép, a rendszer automatikusan eltávolítja a folyamat DLL-jeit, de nem hoz létre UNLOAD_DLL_DEBUG_EVENT hibakeresési eseményt.
RIP_EVENT
Akkor jön létre, amikor egy hibakeresési folyamat a rendszer hibakeresőjének vezérlésén kívül hal meg.
A DEBUG_EVENT szerkezet RIP_INFO struktúrát tartalmaz. Ez a struktúra határozza meg a hibát és a hiba típusát.