Windows提供了许多调试程序的方法.其中一个叫Basic Debug.提供了基础调试方法.
他是一个事件驱动的调试方法.提供了简单调试功能.所谓事件驱动就是在相关调试事件发生时给调试器发送相关事件并由调试器对该事件采取适当的动作.
下面就来看看如何创建一个基础调试器.
有两种方式运行基础调试器.
1.其中一个方法是调试正在运行进程.
要对运行中的进程进行调试,可以通过调用DebugActiveProcess,并指定进程标识(PID).
要得到进程ID可以调用 EnumProcesses or Process32First 两个函数.
DebugActiveProcess 将调试器附加到目标进程. 这样就只能调试所附加的进程而不能调试子进程.
调试器必须有适当权限来执行 DebugActiveProcess. 要得到更多权限控制可参阅 权限控制( Access Control ).
在调试器创建或附加到所要调试的目标进程后,系统将目标进程(如果指定子进程也包括在内)发生的所有相关事件发送到调试器. 要了解更多的调试事件可参考 Debugging Events.
要分离调试进程,调试器调用 DebugActiveProcessStop 函数.
调试函数声明
BOOL WINAPI DebugActiveProcess( __in DWORD dwProcessId );
dwProcessID 指定进程 PID
如果执行成功返回非0,否则错误返回0,要获取更多错误信息,执行GetLastError.
要停止调试,你只要退出被调试的进程,或者调用 DebugActiveProcessStop 函数.
退出调试器同样退出被调试进程,除非你调用了 DebugSetProcessKillOnExit 函数.
调试器必须对目标进程有相应权限, 并且能对打开的进程具有 PROCESS_ALL_ACCESS权限.
Windows Me/98/95上, 如果目标进程PID有效,调试器 就有适当权限.
其他版本Windows, 如果目标进程使用了安全描述符,调试器如果没有Full Access,
调用DebugActiveProcess 将失败.如果调试进程具有 SE_DEBUG_NAME 权限并启用,它就能调试任何进程。
系统检测完进程PID,并确认调试器有效后。函数DebugActiveProcess返回 TRUE.然后调试器调用 WaitForDebugEvent 函数来等待事件。这里要注意, DebugActiveProcess WaitForDebugEvent DebugActiveProcessStop 这三个函数要在同一个线程运行系统暂停被调试进程中的所有线程, 并给调试进程发送被调试进程的当前状态。系统发送一个 CREATE_PROCESS_DEBUG_EVENT 调试事件表明指定进程. CREATE_PROCESS_DEBUG_INFO 的lpStartAddress
成员为NULL
进程中的每个线程,系统发送一个CREATE_THREAD_DEBUG_EVENT事件。 CREATE_THREAD_DEBUG_INFO 的lpStartAddress
目标进程地址空间加载的每一个动态库(DLL),系统将发送一个 LOAD_DLL_DEBUG_EVENT 调试事件。成员为NULL
系统将安排给第一个线程一个断点,当恢复运行时将停在那。
当所有这些都完成后,系统恢复运行所有的线程。并执行断点引发一个 EXCEPTION_DEBUG_EVENT 调试事件。
然后其它调试事件将陆续发送到调试器。
函数要求指引
系统要求 |
Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95. |
---|---|
服务器版本 |
Requires Windows Server 2008, Windows Server 2003, Windows 2000 Server, or Windows NT Server. |
头文件 |
Declared in Winbase.h; include Windows.h. |
链接库 |
Use Kernel32.lib. |
动态库 |
Requires Kernel32.dll. |
2.另外一个方法是使用CreateProcess函数创建要调试的进程,并给创建标记(CreateFlag)设置为DEBUG_PROCESS
如果不想接受被调试进程子进程调试消息可添加标记DEBUG_ONLY_THIS_PROCESS,即设置创建标记为DEBUG_ONLY_THIS_PROCESS | DEBUG_PROCESS
创建后直接可通过WaitForDebugEvent接收调试事件。