Windows基础调试器(BASIC DEBUGGER)

本文介绍在Windows环境下通过DebugActiveProcess和CreateProcess两种方法创建基础调试器的过程。前者可调试已运行进程,后者则用于创建带有调试标志的新进程。文章详细解释了函数参数及调试事件的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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_INFOlpStartAddress

成员为NULL

 

进程中的每个线程,系统发送一个CREATE_THREAD_DEBUG_EVENT事件。  CREATE_THREAD_DEBUG_INFOlpStartAddress

成员为NULL

目标进程地址空间加载的每一个动态库(DLL),系统将发送一个 LOAD_DLL_DEBUG_EVENT 调试事件。 
系统将安排给第一个线程一个断点,当恢复运行时将停在那。

当所有这些都完成后,系统恢复运行所有的线程。并执行断点引发一个 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接收调试事件。

这是一个windows脚本调试器程序。 绿色:只需复制文件到同一目录下就可以了。 纯净:基本不使用注册表,只是在注册文件类型图标和文件关联时才使用了注册表。 无毒:绝对没有任何恶意代码,但是由于程序会自动产生临时的批处理文件,可能会被杀毒软件误报。 注意:如果不能启动,下载vcredist_x86.exe安装VC运行库,然后再试。 已经实现的功能: 设置断点; 在断点命中时在代码编辑器指示哪个断点被命中。 在断点命中时可以观察现场状态【变量、ErrorLevel、当前目录】; 如果批处理没有调用Exit退出,那么可以观察到批处理执行完的现场状态; 调试暂停时会自动打开/切换文件并滚动代码窗口,使当前断点可见; 可以预设批处理执行前的环境变量和当前目录。 工程管理,也就是管理批处理文件、断点、观察变量、初始环境变量、初始当前目录、批处理入口文件、批处理文件命令行参数的信息。 支持用户自定义界面,使用标签多文档界面和停靠栏。 双击.bdc文件,会启动windows脚本调试器。 附带使用手册和批处理指南。 准备实现的功能: 在断点命中时修改环境变量或者当前目录; 语法分析【代码着色、语法检查的基础】; 语法检查; 代码着色; 内置命令帮助; 不打算实现的功能: 我感觉批处理编程并不能提供多少智能提示,所以就不做了。 局限性: 代码编辑器暂时不支持中文,这个是最大的限制了,我会在下个版本解决这个问题; 只可以在批处理语句之前加断点,不可以在空行、标签行和右括号)开头的行加断点,不可以在非批处理代码处加断点; 不支持单步调试; 必须在调试之前加断点,在调试之后加的断点,只能在以后的调试会话中起作用。 启动批处理脚本只能接受10个参数,这个限制好像问题不大。 目前可能还有bug。 注意: 不要调试本程序所在目录下的那三个批处理程序,否则会出现无法预料的行为。为了保险,请把他们设为只读隐藏文件。 可以把halt.exe也设为只读隐藏文件。 我会持续改进本程序。 email: cdp97531@sina.com blog: http://hi.baidu.com/chendeping/home
这是一个windows脚本调试器程序。 纯净:基本不使用注册表,只是在注册文件类型图标和文件关联时才使用了注册表。 无毒:绝对没有任何恶意代码,但是由于程序会自动产生临时的批处理文件,可能会被杀毒软件误报。 注意:如果不能启动,下载vcredist_x86.exe安装VC运行库,然后再试。 已经实现的功能: 设置断点,并略微智能地判断是否可以中断; 在断点命中时在代码编辑器指示哪个断点被命中。 在断点命中时可以观察现场状态【变量、ErrorLevel、当前目录】; 如果批处理没有调用Exit退出,那么可以观察到批处理执行完的现场状态; 调试暂停时会自动打开/切换文件并滚动代码窗口,使当前断点可见; 可以预设批处理执行前的环境变量和当前目录。 工程管理,也就是管理批处理文件、断点、观察变量、初始环境变量、初始当前目录、批处理入口文件、 批处理文件命令行参数的信息。 支持用户自定义界面,使用标签多文档界面和停靠栏。 双击.bdc文件,会启动windows脚本调试器。 附带使用手册和批处理指南。 增加了命令行参考。 代码着色; 代码编辑器可以支持中文及其他语言。 准备实现的功能: 在断点命中时修改环境变量或者当前目录; 语法检查; 不打算实现的功能: 我感觉批处理编程并不能提供多少智能提示,所以就不做了。 局限性: 不支持单步调试; 必须在调试之前加断点,在调试之后加的断点,只能在以后的调试会话中起作用。 启动批处理脚本只能接受10个参数,这个限制好像问题不大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值