|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Using Debugging Support
The following example uses the WaitForDebugEvent and ContinueDebugEvent functions to illustrate how a simple debugger might be organized.
DEBUG_EVENT DebugEv; // debugging event information 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 kernel. // Last chance: Display an appropriate error.
case EXCEPTION_BREAKPOINT: // First chance: Display the current // instruction and register values. case EXCEPTION_DATATYPE_MISALIGNMENT: // First chance: Pass this on to the kernel. // Last chance: Display an appropriate error. case EXCEPTION_SINGLE_STEP: // First chance: Update the display of the // current instruction and register values.
case DBG_CONTROL_C: // First chance: Pass this on to the kernel. // Last chance: Display an appropriate error. // Handle other exceptions. } 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.
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.
case EXIT_THREAD_DEBUG_EVENT: // Display the thread's exit code. case EXIT_PROCESS_DEBUG_EVENT: // Display the process's exit code. case LOAD_DLL_DEBUG_EVENT: // Read the debugging information included in the newly // loaded DLL. case UNLOAD_DLL_DEBUG_EVENT: // Display a message that the DLL has been unloaded. case OUTPUT_DEBUG_STRING_EVENT: // Display the output debugging string.
} // Resume executing the thread that reported the debugging event. ContinueDebugEvent(DebugEv.dwProcessId, DebugEv.dwThreadId, dwContinueStatus); }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Использование, отлаживающий Поддержку
Следующий пример использует WaitForDebugEvent и функции ContinueDebugEvent, чтобы иллюстрировать как простой отладчик мог быть организован.
DEBUG_EVENT DebugEv; // отладочная информация события DWORD dwContinueStatus = DBG_CONTINUE; // исключительное продолжение для(;;) { // Ожидание отладочное событие, чтобы происходить. Второй параметр указывает //, что функция не возвращает пока отладочное событие не произойдет. WaitForDebugEvent(&DebugEv, БЕСКОНЕЧНЫЙ); // Процесс отладочный код события. ключ (DebugEv.dwDebugEventCode) { случай EXCEPTION_DEBUG_EVENT:
// Процесс исключительный код. Когда обработка // исключения, не забывает устанавливать продолжение // параметр статуса (dwContinueStatus). Эта величина // использована функцией ContinueDebugEvent. ключ (DebugEv.u.Исключение.ExceptionRecord.ExceptionCode) { случай EXCEPTION_ACCESS_VIOLATION: // шанс Первого: Передайте это на в зерно. // Последний шанс: Отобразите подходящую ошибку.
случай EXCEPTION_BREAKPOINT: // шанс Первого: Отобразите течение // инструкция и регистрируйте величины. случай EXCEPTION_DATATYPE_MISALIGNMENT: // шанс Первого: Передайте это на в зерно. // Последний шанс: Отобразите подходящую ошибку. случай EXCEPTION_SINGLE_STEP: // шанс Первого: Скорректируйте дисплей // текущей инструкции и регистрируйте величины.
случай DBG_CONTROL_C: // шанс Первого: Передайте это на в зерно. // Последний шанс: Отобразите подходящую ошибку. // Ручка другие исключения. } случай CREATE_THREAD_DEBUG_EVENT: // Как и требуется, изучать или изменять регистры / резьбу/ с GetThreadContext и функции SetThreadContext; // и приостановите и продолжайте выполнение резьбы с // SuspendThread и функции ResumeThread.
случай CREATE_PROCESS_DEBUG_EVENT: // Как и требуется, изучать или изменять регистры // начальной резьбы процесса с GetThreadContext и // функции SetThreadContext; прочитайтесь из и записывайтесь в // виртуальную память процесса с ReadProcessMemory и // функциями WriteProcessMemory; и приостановите и продолжайте // заправлять выполнение с SuspendThread и функции ResumeThread //.
случай EXIT_THREAD_DEBUG_EVENT: // Отображать выходной код резьбы. случай EXIT_PROCESS_DEBUG_EVENT: // Отображать выходной код процесса. случай LOAD_DLL_DEBUG_EVENT: // Прочитавшее отладочную информацию включался в вновь // загрузившее DLL. случай UNLOAD_DLL_DEBUG_EVENT: // Отображать сообщение, что DLL разгружен. случай OUTPUT_DEBUG_STRING_EVENT: // Отображать выход, отлаживающий строку.
} // Резюме, выполняющее резьбу, которая сообщала отладочное событие. ContinueDebugEvent(DebugEv.dwProcessId, DebugEv.dwThreadId, dwContinueStatus); }
|
|
|
|
| |