03 07

The loop writing process

the loop writing process

This documentation is archived and is not being maintained.

The debugger uses the WaitForDebugEvent function at the beginning of its main loop. This function blocks the debugger until a debugging event occurs. When the debugging event occurs, the system suspends all threads in the process being debugged and notifies the debugger of the event.

The debugger can interact with the user, or manipulate the state of the process being debugged, by using the GetThreadContext, GetThreadSelectorEntry, ReadProcessMemory, SetThreadContext, and WriteProcessMemory functions. GetThreadSelectorEntry returns the descriptor table entry for a specified selector and thread. Debuggers use the descriptor table entry to convert a segment-relative address to a linear virtual address. The ReadProcessMemory and WriteProcessMemory functions require linear virtual addresses.

Debuggers frequently read the memory of the process being debugged and write the memory that contains instructions to the instruction cache. After the instructions are written, the debugger calls the FlushInstructionCache function to execute the cached instructions.

The debugger uses the ContinueDebugEvent function at the end of its main loop. This function allows the process being debugged to continue executing.

The following example uses the WaitForDebugEvent and ContinueDebugEvent functions to illustrate how a simple debugger might be organized.

#include <windows.h> DWORD OnCreateThreadDebugEvent(const LPDEBUG_EVENT); DWORD OnCreateProcessDebugEvent(const LPDEBUG_EVENT); DWORD OnExitThreadDebugEvent(const LPDEBUG_EVENT); DWORD OnExitProcessDebugEvent(const LPDEBUG_EVENT); DWORD OnLoadDllDebugEvent(const LPDEBUG_EVENT); DWORD OnUnloadDllDebugEvent(const LPDEBUG_EVENT); DWORD OnOutputDebugStringEvent(const LPDEBUG_EVENT); DWORD OnRipEvent(const LPDEBUG_EVENT); void EnterDebugLoop(const LPDEBUG_EVENT DebugEv) { DWORD dwContinueStatus = DBG_CONTINUE; // exception continuation for(;;) { // Wait for a debugging event to occur. The second parameter indicates // that the function does not return until a debugging event occurs. WaitForDebugEvent(DebugEv, INFINITE); // Process the debugging event code. switch (DebugEv->dwDebugEventCode) { case EXCEPTION_DEBUG_EVENT: // Process the exception code. When handling // exceptions, remember to set the continuation // status parameter (dwContinueStatus). This value // is used by the ContinueDebugEvent function. switch(DebugEv->u.Exception.ExceptionRecord.ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: // First chance: Pass this on to the system. // Last chance: Display an appropriate error. break; case EXCEPTION_BREAKPOINT: // First chance: Display the current // instruction and register values. break; case EXCEPTION_DATATYPE_MISALIGNMENT: // First chance: Pass this on to the system. // Last chance: Display an appropriate error. break; case EXCEPTION_SINGLE_STEP: // First chance: Update the display of the // current instruction and register values. break; case DBG_CONTROL_C: // First chance: Pass this on to the system. // Last chance: Display an appropriate error. break; default: // Handle other exceptions. break; } break; case CREATE_THREAD_DEBUG_EVENT: // As needed, examine or change the thread's registers // with the GetThreadContext and SetThreadContext functions; // and suspend and resume thread execution with the // SuspendThread and ResumeThread functions. dwContinueStatus = OnCreateThreadDebugEvent(DebugEv); break; case CREATE_PROCESS_DEBUG_EVENT: // As needed, examine or change the registers of the // process's initial thread with the GetThreadContext and // SetThreadContext functions; read from and write to the // process's virtual memory with the ReadProcessMemory and // WriteProcessMemory functions; and suspend and resume // thread execution with the SuspendThread and ResumeThread // functions. Be sure to close the handle to the process image // file with CloseHandle. dwContinueStatus = OnCreateProcessDebugEvent(DebugEv); break; case EXIT_THREAD_DEBUG_EVENT: // Display the thread's exit code. dwContinueStatus = OnExitThreadDebugEvent(DebugEv); break; case EXIT_PROCESS_DEBUG_EVENT: // Display the process's exit code. dwContinueStatus = OnExitProcessDebugEvent(DebugEv); break; case LOAD_DLL_DEBUG_EVENT: // Read the debugging information included in the newly // loaded DLL. Be sure to close the handle to the loaded DLL // with CloseHandle. dwContinueStatus = OnLoadDllDebugEvent(DebugEv); break; case UNLOAD_DLL_DEBUG_EVENT: // Display a message that the DLL has been unloaded. dwContinueStatus = OnUnloadDllDebugEvent(DebugEv); break; case OUTPUT_DEBUG_STRING_EVENT: // Display the output debugging string. dwContinueStatus = OnOutputDebugStringEvent(DebugEv); break; case RIP_EVENT: dwContinueStatus = OnRipEvent(DebugEv); break; } // Resume executing the thread that reported the debugging event. ContinueDebugEvent(DebugEv->dwProcessId, DebugEv->dwThreadId, dwContinueStatus); } }

duke.edu [email protected]
Copyright © 1998, Owen Astrachan and Eugene Wallingford
Permission is granted to make copies for PLoP'98.


There are many ways to look at patterns. An especially useful way to think of patterns is as a tool for teaching. We don't use patterns blindly; we learn them. Patterns are all about learning successful techniques, understanding when and how to use them. At ChiliPLoP'98, a small group of computer science educators gathered to think about and write patterns appropriate for novices learning to program in the first two years of undergraduate instruction. (For more information or to become involved in this ongoing project, visit the elementary patterns web page.

How do you find an object that meets a specific condition?

Suppose that you have a set of students, and you would like to find the first student with an "A" average. In the worst case, you will look at the whole collection before finding your target. But, if you find a match sooner, you would like to terminate the search and work with the object that you found.

Therefore, construct a Process All Items loop, but provide a way to exit the loop early should you find your target sooner.

Express your student search as:

for (i = 0; i < students.size(); i++) if (student[i].grade().isAnA()) break; // process student[i], who has an A

If it is possible that you will not find your target, be sure to do a Guarded Linear Search.


  1. Yujenure

    D10: strictly linear. I can"t even write one scene ahead, and while I respect everyone"s writing process, it drives me slightly crazy when they tell me of their cool new scene, and I"m like: this is from the trilogy? No? Prequel? Sequel? Continuation? I"m lost!

  2. Rovomaxenukodo

    I should have to be writing out a step-by-step process for the guys who developed our stuff. Maybe after this I can get back to my actual work

  3. Vebayozowe

    I"m basically retired so take my advice with a grain of salt but I found just the process of writing stuff down helped immensely even if I never looked at my notes again.

  4. Sefegoqo

    Besides me, my cats are the most involved in my writing process. They sleep on my robe so it"s warm when I get up at 6am. Sit with me while I write. Offer cuddles when I"m struggling with the next sentence. I may have to thank them in the acknowledgements once I get published.

  5. Tiqahewoji

    Have been writing to Customer Care BMO Support from last 1 year to chase down Its an endless loop and waste of time process by to fool around customers and make money by selling fake schemes and faulty products. Shame

  6. Lewejubuwe

    Currently in the process of writing a record that we’re naming gold sequined sweatpants because we actually just wanna be a less accessible chiodos

  7. Jogawikawe

    The process of making a is one of discovery, and like writing a story, you follow a lead and that leads you to something else.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>