在Windows中,Windows API CreateProcess提供了一个枚举值允许你的程序调试其他的程序,比如下面的代码就是创建一个调试器的最基本的步骤:
1. 启动一个程序,并指定你希望调试这个程序—例如DEBUG_PROCESS
2. 然后监听Windows给你的程序发送的各种调试消息,例如被调试程序正在加载一个新的DLL(不管是静态调用还是动态调用),被调试程序正在创建一个新的线程等等。
下面的代码演示了如何编写一个最简单的调试器 – 监听被调试的程序里面所触发的异常然后根据异常类型进行相应的处理:
#include "stdafx.h" #include
extern "C" __declspec(dllexport) DWORD CreateProcessHelper(LPTSTR lpCommandName, STARTUPINFO *pStartInfo) { PROCESS_INFORMATION info; ZeroMemory(&info, sizeof(PROCESS_INFORMATION));
if ( !CreateProcess(NULL, lpCommandName, NULL, NULL, FALSE, DEBUG_PROCESS | CREATE_SUSPENDED | DEBUG_ONLY_THIS_PROCESS, NULL, NULL, pStartInfo, &info) ) { return GetLastError(); }
::CloseHandle(info.hProcess);
DEBUG_EVENT debugEv; ZeroMemory(&debugEv, sizeof(DEBUG_EVENT));
::ResumeThread(info.hThread);
for ( ; ; ) { WaitForDebugEvent(&debugEv, INFINITE);
DWORD exceptionCode = 0; switch (debugEv.dwDebugEventCode) { case EXCEPTION_DEBUG_EVENT: exceptionCode = debugEv.u.Exception.ExceptionRecord.ExceptionCode; if ( exceptionCode == 0x80000003 ) break; else { ::TerminateProcess(info.hProcess, exceptionCode); return exceptionCode; }
case EXIT_PROCESS_DEBUG_EVENT: return 0;
default: break; }
ContinueDebugEvent(debugEv.dwProcessId, debugEv.dwThreadId, DBG_CONTINUE); } } |