Sdílet prostřednictvím


Ladění událostí

Událost ladění je incident v procesu, který je laděný, který způsobí, že systém upozorní ladicí program. Mezi ladicí události patří vytvoření procesu, vytvoření vlákna, načtení dynamické knihovny (DLL), uvolnění knihovny DLL, odeslání výstupního řetězce a generování výjimky.

Pokud dojde k události ladění, zatímco ladicí program čeká na jeden, systém vyplní DEBUG_EVENT strukturu určenou WaitForDebugEvent informacemi popisující událostí.

Když systém upozorní ladicí program události ladění, pozastaví také všechna vlákna v ovlivněném procesu. Vlákna nepřerušují provádění, dokud ladicí program nepřetrvá v události ladění pomocí ContinueDebugEvent. Při ladění procesu může dojít k následujícím událostem ladění.

Ladění události Popis
CREATE_PROCESS_DEBUG_EVENT
Generuje se při každém vytvoření nového procesu v procesu, který je laděný, nebo kdykoli ladicí program zahájí ladění již aktivního procesu. Systém vygeneruje tuto událost ladění předtím, než se proces začne spouštět v uživatelském režimu a před tím, než systém vygeneruje všechny další události ladění pro nový proces.
Struktura DEBUG_EVENT obsahuje strukturu CREATE_PROCESS_DEBUG_INFO. Tato struktura zahrnuje popisovač nového procesu, popisovač souboru obrázku procesu, popisovač počátečního vlákna procesu a další informace, které popisují nový proces.
Popisovač procesu má PROCESS_VM_READ a PROCESS_VM_WRITE přístup. Pokud ladicí program má tyto typy přístupu k vláknu, může číst a zapisovat do paměti procesu pomocí ReadProcessMemory a WriteProcessMemory funkcí. Pokud systém dříve oznámil událost EXIT_PROCESS_DEBUG_EVENT, systém zavře tento popisovač při volání ContinueDebugEvent funkce.
Popisovač souboru obrázku procesu má GENERIC_READ přístup a je otevřen pro sdílení pro čtení. Ladicí program by měl tento popisovač zavřít při zpracování CREATE_PROCESS_DEBUG_EVENT.
Popisovač počátečního vlákna procesu má THREAD_GET_CONTEXT, THREAD_SET_CONTEXT a THREAD_SUSPEND_RESUME přístup k vláknu. Pokud má ladicí program tyto typy přístupu k vláknu, může číst a zapisovat do registrů vlákna pomocí GetThreadContext a Funkce SetThreadContext a může pozastavit a obnovit vlákno pomocí SuspendThread a ResumeThread. Pokud systém dříve oznámil událost EXIT_PROCESS_DEBUG_EVENT, systém zavře tento popisovač při volání ContinueDebugEvent funkce.
CREATE_THREAD_DEBUG_EVENT
Generuje se při každém vytvoření nového vlákna v procesu, který je laděn, nebo kdykoli ladicí program zahájí ladění již aktivního procesu. Tato událost ladění se vygeneruje před zahájením spuštění nového vlákna v uživatelském režimu.
Struktura DEBUG_EVENT obsahuje strukturu CREATE_THREAD_DEBUG_INFO. Tato struktura zahrnuje popisovač nového vlákna a počáteční adresu vlákna. Popisovač má THREAD_GET_CONTEXT, THREAD_SET_CONTEXT a THREAD_SUSPEND_RESUME přístup k vláknu. Pokud má ladicí program tyto typy přístupu k vláknu, může číst a zapisovat do registrů vlákna pomocí GetThreadContext a Funkce SetThreadContext a může pozastavit a obnovit vlákno pomocí SuspendThread a ResumeThread.
Pokud systém dříve oznámil událost EXIT_THREAD_DEBUG_EVENT, systém zavře popisovač do nového vlákna, když ladicí program volá funkci ContinueDebugEvent.
EXCEPTION_DEBUG_EVENT
Vygenerováno vždy, když dojde k výjimce v procesu, který je laděný. Mezi možné výjimky patří pokus o přístup k nepřístupné paměti, provádění pokynů zarážky, pokus o dělení nulou nebo jakoukoli jinou výjimku, kterou jste si poznamenali v strukturované zpracování výjimek.
Struktura DEBUG_EVENT obsahuje strukturu EXCEPTION_DEBUG_INFO. Tato struktura popisuje výjimku, která způsobila událost ladění.
Kromě standardních podmínek výjimky může během ladění procesu konzoly dojít k dalšímu kódu výjimky. Systém vygeneruje kód výjimky DBG_CONTROL_C při vstupu CTRL+C do procesu konzoly, který zpracovává signály CTRL+C a je laděný. Tento kód výjimky není určen ke zpracování aplikacemi. Aplikace by nikdy neměla k řešení použít obslužnou rutinu výjimky. Je vyvolána pouze pro výhodu ladicího programu a používá se pouze v případě, že je ladicí program připojený k procesu konzoly.
Pokud se proces neladí nebo pokud ladicí program předá DBG_CONTROL_C neošetřenou výjimku (prostřednictvím příkazu gn), prohledá se seznam funkcí obslužné rutiny aplikace, jak je uvedeno pro funkci SetConsoleCtrl Handler.
Pokud ladicí program zpracovává výjimku DBG_CONTROL_C (prostřednictvím příkazu gh), aplikace si nevšimne CTRL+C s výjimkou kódu, jako je tento.
while ((inputChar = getchar()) != EOF) ...
Ladicí program proto nelze použít k zastavení čekání čtení v takovém kódu před ukončením.
EXIT_PROCESS_DEBUG_EVENT
Vygenerováno při každém ukončení posledního vlákna v procesu, který je laděn. K této události ladění dojde okamžitě po uvolnění knihoven DLL procesu a aktualizaci ukončovacího kódu procesu.
Struktura DEBUG_EVENT obsahuje EXIT_PROCESS_DEBUG_INFO strukturu, která určuje ukončovací kód.
Ladicí program uvolní všechny interní struktury přidružené k procesu při přijetí této události ladění. Systém zavře popisovač ladicího programu na ukončovací proces a všechna vlákna procesu. Ladicí program by neměl tyto popisovače zavírat.
Část vypnutí procesu v režimu jádra nelze dokončit, dokud ladicí program, který přijímá volání této události ContinueDebugEvent. Do té doby jsou obslužné rutiny procesu otevřené a virtuální adresní prostor se nevyvolá, takže ladicí program může prozkoumat podřízený proces. Chcete-li obdržet oznámení, když je část procesu v režimu jádra dokončena, duplikujte popisovač vrácený pomocí CREATE_PROCESS_DEBUG_EVENT, volání ContinueDebugEventa potom počkejte, až bude duplikovaný popisovač procesu signalován.
EXIT_THREAD_DEBUG_EVENT
Generuje se při každém ukončení vlákna, které je součástí procesu ladění. Systém vygeneruje tuto událost ladění ihned po aktualizaci ukončovacího kódu vlákna.
Struktura DEBUG_EVENT obsahuje EXIT_THREAD_DEBUG_INFO strukturu, která určuje ukončovací kód.
K této události ladění nedojde, pokud je ukončovací vlákno posledním vláknem procesu. V tomto případě dojde místo toho k události ladění EXIT_PROCESS_DEBUG_EVENT.
Ladicí program uvolní všechny interní struktury přidružené k vláknu při přijetí této události ladění. Systém zavře popisovač ladicího programu do ukončujícího vlákna. Ladicí program by neměl tento popisovač zavřít.
LOAD_DLL_DEBUG_EVENT
Vygenerováno při každém ladění procesu načte knihovnu DLL. Tato událost ladění nastane, když zavaděč systému přeloží odkazy na knihovnu DLL nebo když laděný proces používá LoadLibrary funkce. Tato událost ladění nastane pouze při prvním připojení systému knihovny DLL k virtuálnímu adresního prostoru procesu.
Struktura DEBUG_EVENT obsahuje strukturu LOAD_DLL_DEBUG_INFO. Tato struktura zahrnuje popisovač nově načtené knihovny DLL, základní adresu knihovny DLL a další informace popisované knihovnou DLL. Ladicí program by měl při zpracování LOAD_DLL_DEBUG_EVENT zavřít popisovač knihovny DLL.
Ladicí program obvykle načte tabulku symbolů přidruženou k knihovně DLL při přijetí této události ladění.
OUTPUT_DEBUG_STRING_EVENT
Vygenerováno při ladění procesu používá
outputDebugString funkce. Struktura DEBUG_EVENT obsahuje strukturu OUTPUT_DEBUG_STRING_INFO. Tato struktura určuje adresu, délku a formát řetězce ladění.
UNLOAD_DLL_DEBUG_EVENT
Generuje se při každém ladění procesu uvolnění knihovny DLL pomocí funkce FreeLibrary. Tato událost ladění nastane pouze při posledním uvolnění knihovny DLL z adresního prostoru procesu (to znamená, že pokud je počet využití knihovny DLL nulový).
Struktura DEBUG_EVENT obsahuje strukturu UNLOAD_DLL_DEBUG_INFO. Tato struktura určuje základní adresu knihovny DLL v adresních prostorech procesu, který uvolní knihovnu DLL.
Ladicí program obvykle uvolní tabulku symbolů přidruženou k knihovně DLL při přijetí této události ladění.
Když se proces ukončí, systém automaticky uvolní knihovny DLL procesu, ale nevygeneruje UNLOAD_DLL_DEBUG_EVENT událost ladění.
RIP_EVENT
Generuje se vždy, když laděný proces zemře mimo řízení systémového ladicího programu.
Struktura DEBUG_EVENT obsahuje strukturu RIP_INFO. Tato struktura určuje chybu a typ chyby.