Foutopsporingsevenementen
Een foutopsporingsgebeurtenis is een incident in het proces dat wordt opgespoord, waardoor het systeem het foutopsporingsprogramma op de hoogte brengt. Foutopsporingsgebeurtenissen omvatten het maken van een proces, het maken van een thread, het laden van een DLL (Dynamic-Link Library), het lossen van een DLL, het verzenden van een uitvoertekenreeks en het genereren van een uitzondering.
Als er een foutopsporings gebeurtenis optreedt terwijl een foutopsporingsprogramma wacht op een gebeurtenis, vult het systeem de DEBUG_EVENT structuur die is opgegeven door WaitForDebugEvent- met informatie over de gebeurtenis.
Wanneer het systeem het foutopsporingsprogramma van een foutopsporings gebeurtenis opgeeft, worden ook alle threads in het betrokken proces onderbroken. De threads hervatten de uitvoering pas als het foutopsporingsprogramma de foutopsporings gebeurtenis voortzet met behulp van ContinueDebugEvent. De volgende foutopsporingsgebeurtenissen kunnen optreden terwijl er fouten in een proces worden opgespoord.
Foutopsporings gebeurtenis | Beschrijving |
---|---|
CREATE_PROCESS_DEBUG_EVENT |
Wordt gegenereerd wanneer een nieuw proces wordt gemaakt in een proces dat wordt opgespoord of wanneer het foutopsporingsprogramma begint met het opsporen van fouten in een al actief proces. Het systeem genereert deze foutopsporings gebeurtenis voordat het proces wordt uitgevoerd in de gebruikersmodus en voordat het systeem andere foutopsporingsevenementen genereert voor het nieuwe proces. De DEBUG_EVENT structuur bevat een CREATE_PROCESS_DEBUG_INFO structuur. Deze structuur bevat een ingang voor het nieuwe proces, een ingang naar het afbeeldingsbestand van het proces, een ingang naar de eerste thread van het proces en andere informatie die het nieuwe proces beschrijft. De ingang voor het proces heeft PROCESS_VM_READ en PROCESS_VM_WRITE toegang. Als een foutopsporingsprogramma deze typen toegang heeft tot een thread, kan deze lezen en schrijven naar het geheugen van het proces met behulp van de functies ReadProcessMemory en WriteProcessMemory. Als het systeem eerder een EXIT_PROCESS_DEBUG_EVENT gebeurtenis heeft gerapporteerd, sluit het systeem deze ingang wanneer het foutopsporingsprogramma de functie ContinueDebugEvent aanroept. De ingang voor het afbeeldingsbestand van het proces heeft GENERIC_READ toegang en wordt geopend voor het delen van leesbewerkingen. Het foutopsporingsprogramma moet deze ingang sluiten tijdens het verwerken van CREATE_PROCESS_DEBUG_EVENT. De ingang voor de eerste thread van het proces heeft THREAD_GET_CONTEXT, THREAD_SET_CONTEXT en THREAD_SUSPEND_RESUME toegang tot de thread. Als een foutopsporingsprogramma deze typen toegang heeft tot een thread, kan deze lezen van en schrijven naar de registers van de thread met behulp van de GetThreadContext- en SetThreadContext-functies en kan de thread worden onderbroken en hervat met behulp van de SuspendThread- en ResumeThread-functies. Als het systeem eerder een EXIT_PROCESS_DEBUG_EVENT gebeurtenis heeft gerapporteerd, sluit het systeem deze ingang wanneer het foutopsporingsprogramma de functie ContinueDebugEvent aanroept. |
CREATE_THREAD_DEBUG_EVENT |
Gegenereerd wanneer een nieuwe thread wordt gemaakt in een proces dat wordt opgespoord of wanneer het foutopsporingsprogramma begint met het opsporen van fouten in een al actief proces. Deze foutopsporings gebeurtenis wordt gegenereerd voordat de nieuwe thread wordt uitgevoerd in de gebruikersmodus. De DEBUG_EVENT structuur bevat een CREATE_THREAD_DEBUG_INFO structuur. Deze structuur bevat een ingang voor de nieuwe thread en het beginadres van de thread. De ingang heeft THREAD_GET_CONTEXT, THREAD_SET_CONTEXT en THREAD_SUSPEND_RESUME toegang tot de thread. Als een foutopsporingsprogramma deze typen toegang heeft tot een thread, kan deze lezen van en schrijven naar de registers van de thread met behulp van de GetThreadContext- en SetThreadContext-functies en kan de thread worden onderbroken en hervat met behulp van de SuspendThread- en ResumeThread-functies. Als het systeem eerder een EXIT_THREAD_DEBUG_EVENT gebeurtenis heeft gerapporteerd, sluit het systeem de ingang naar de nieuwe thread wanneer het foutopsporingsprogramma de functie ContinueDebugEvent aanroept. |
EXCEPTION_DEBUG_EVENT |
Gegenereerd wanneer er een uitzondering optreedt in het proces dat wordt opgespoord. Mogelijke uitzonderingen zijn pogingen om toegang te krijgen tot niet-toegankelijk geheugen, het uitvoeren van instructies voor onderbrekingspunten, het delen door nul of een andere uitzondering die is vermeld in Structured Exception Handling. De DEBUG_EVENT structuur bevat een EXCEPTION_DEBUG_INFO structuur. In deze structuur wordt de uitzondering beschreven die de foutopsporings gebeurtenis heeft veroorzaakt. Naast de standaard uitzonderingsvoorwaarden kan er een extra uitzonderingscode optreden tijdens foutopsporing van consoleprocessen. Het systeem genereert een DBG_CONTROL_C uitzonderingscode wanneer Ctrl+C invoer is voor een consoleproces dat Ctrl+C-signalen verwerkt en foutopsporing uitvoert. Deze uitzonderingscode is niet bedoeld om te worden verwerkt door toepassingen. Een toepassing mag nooit een uitzonderingshandler gebruiken om ermee om te gaan. Het wordt alleen gegenereerd voor het voordeel van het foutopsporingsprogramma en wordt alleen gebruikt wanneer een foutopsporingsprogramma is gekoppeld aan het consoleproces. Als er geen foutopsporing wordt uitgevoerd in een proces of als het foutopsporingsprogramma de DBG_CONTROL_C uitzondering onverwerkt doorgeeft (via de gn-opdracht), wordt de lijst met handlerfuncties van de toepassing doorzocht, zoals beschreven voor de SetConsoleCtrlHandler--functie. Als het foutopsporingsprogramma de DBG_CONTROL_C uitzondering afhandelt (via de opdracht gh), ziet een toepassing niet ctrl+C, behalve in code zoals deze. while ((inputChar = getchar()) != EOF) ... Het foutopsporingsprogramma kan dus niet worden gebruikt om te voorkomen dat de leeswacht in dergelijke code wordt beƫindigd. |
EXIT_PROCESS_DEBUG_EVENT |
Wordt gegenereerd wanneer de laatste thread in een proces dat wordt opgespoord, wordt afgesloten. Deze foutopsporings gebeurtenis vindt direct plaats nadat het systeem de DLL's van het proces heeft verwijderd en de afsluitcode van het proces bijwerkt. De DEBUG_EVENT-structuur bevat een EXIT_PROCESS_DEBUG_INFO structuur waarmee de afsluitcode wordt opgegeven. Het foutopsporingsprogramma verwijst de toewijzing van interne structuren die zijn gekoppeld aan het proces na ontvangst van deze foutopsporings gebeurtenis. Het systeem sluit de ingang van het foutopsporingsprogramma tot het afsluitende proces en alle threads van het proces. Het foutopsporingsprogramma mag deze ingangen niet sluiten. Het gedeelte van het afsluiten van het proces in de kernelmodus kan pas worden voltooid als het foutopsporingsprogramma dat deze gebeurtenis ontvangt ContinueDebugEvent-. Tot die tijd zijn de procesgrepen geopend en wordt de virtuele adresruimte niet vrijgegeven, zodat het foutopsporingsprogramma het onderliggende proces kan onderzoeken. Als u een melding wilt ontvangen wanneer het kernelmodusgedeelte van het afsluiten van het proces is voltooid, dupliceert u de ingang die wordt geretourneerd met CREATE_PROCESS_DEBUG_EVENT, roept u ContinueDebugEventaan en wacht u totdat de dubbele procesgreep wordt gesignaleerd. |
EXIT_THREAD_DEBUG_EVENT |
Wordt gegenereerd wanneer een thread die deel uitmaakt van een proces dat wordt opgespoord, wordt afgesloten. Het systeem genereert deze foutopsporings gebeurtenis direct nadat deze de afsluitcode van de thread heeft bijgewerkt. De DEBUG_EVENT structuur bevat een EXIT_THREAD_DEBUG_INFO structuur waarmee de afsluitcode wordt opgegeven. Deze foutopsporings gebeurtenis treedt niet op als de afsluitende thread de laatste thread van een proces is. In dit geval vindt de gebeurtenis EXIT_PROCESS_DEBUG_EVENT foutopsporing plaats. Het foutopsporingsprogramma verwijst de toewijzing van interne structuren die zijn gekoppeld aan de thread na ontvangst van deze foutopsporings gebeurtenis. Het systeem sluit de ingang van het foutopsporingsprogramma naar de afsluitende thread. Het foutopsporingsprogramma mag deze ingang niet sluiten. |
LOAD_DLL_DEBUG_EVENT |
Gegenereerd wanneer een proces dat wordt opgespoord, een DLL laadt. Deze foutopsporingsgebeurtenis treedt op wanneer het systeemlaadprogramma koppelingen naar een DLL oplost of wanneer het foutopsporingsproces gebruikmaakt van de LoadLibrary--functie. Deze foutopsporings gebeurtenis vindt alleen plaats wanneer het systeem voor het eerst een DLL koppelt aan de virtuele adresruimte van een proces. De DEBUG_EVENT structuur bevat een LOAD_DLL_DEBUG_INFO structuur. Deze structuur bevat een ingang voor de zojuist geladen DLL, het basisadres van de DLL en andere informatie die het DLL-bestand beschrijft. Het foutopsporingsprogramma moet de ingang naar de DLL-ingang sluiten tijdens het verwerken van LOAD_DLL_DEBUG_EVENT. Normaal gesproken laadt een foutopsporingsprogramma een symbooltabel die is gekoppeld aan het DLL-bestand na ontvangst van deze foutopsporings gebeurtenis. |
OUTPUT_DEBUG_STRING_EVENT |
Gegenereerd wanneer een proces dat wordt opgespoord, gebruikmaakt van de functie OutputDebugString. De DEBUG_EVENT structuur bevat een OUTPUT_DEBUG_STRING_INFO structuur. Deze structuur geeft het adres, de lengte en de notatie van de tekenreeks voor foutopsporing aan. |
UNLOAD_DLL_DEBUG_EVENT |
Wordt gegenereerd wanneer een proces dat wordt opgespoord, een DLL ontlaadt met behulp van de FreeLibrary- functie. Deze foutopsporingsgebeurtenis vindt alleen plaats wanneer een DLL voor het laatst wordt verwijderd uit de adresruimte van een proces (dat wil gezegd, wanneer het aantal gebruiksbewerkingen van het DLL-bestand nul is). De DEBUG_EVENT structuur bevat een UNLOAD_DLL_DEBUG_INFO structuur. Deze structuur geeft het basisadres van de DLL op in de adresruimte van het proces waarmee het DLL-bestand wordt geladen. Normaal gesproken verwijdert een foutopsporingsprogramma een symbooltabel die is gekoppeld aan het DLL-bestand bij het ontvangen van deze foutopsporings gebeurtenis. Wanneer een proces wordt afgesloten, worden de DLL's van het proces automatisch door het systeem verwijderd, maar wordt er geen UNLOAD_DLL_DEBUG_EVENT foutopsporings gebeurtenis gegenereerd. |
RIP_EVENT |
Gegenereerd wanneer een proces dat wordt opgespoord, sterft buiten het beheer van het systeemdebugger. De DEBUG_EVENT structuur bevat een RIP_INFO structuur. Deze structuur geeft de fout en het type fout op. |