Win32调试接口计划与实现浅析[VC/C++编程]
本文“Win32调试接口计划与实现浅析[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
所谓调试器实际上是一个很广泛的概念,但凡可以以某种情势监控其他程序履行历程的程序,都可以泛称为调试器.在Windows平台上,按照调试器的实现原理大约可以将之分为三类:内核态调试器、用户态调试器和伪代码调试器.
内核态调试器直接工作在操作系统内核一级,在硬件与操作系统之间针对系统核心或驱动举行调试,常见的有SoftICE、WinDbg、WDEB386和i386KD等等;用户态调试器则通过操作系统供应的调试接口,在操作系统和用户态程序之间针对用户态程序举行调试,常见的有各种开辟环境如VC/Delphi自带的调试器,OllyDbg等等;伪代码调试器则利用目标系统自定义的调试接口,调试由用户态程序支持的脚本语言或虚拟机代码,常见的如JVM/CLR的调试工具、VB的pcode调试器、Active Script调试器等等.
因为伪代码调试器跟具体系统实现相关性太强,不具有原理层面的通用性,本系列文章尽大概不触及其内容,今后假若有机会可以再谈论一下JVM/CLR/Active Script供应的调试接口;用户态调试器利用最遍及,参考资料也较为完好,我会花较大精神和大家探究;核心态调试器则跟操作系统结合较为精密,加上我也不是太熟习,只能极力而为了,呵呵.欢送大家提出批判指正看法和倡议 :)
此外激烈举荐John Robbins在MSDN的Bugslayer专栏,以及其所著的<Debugging Applications>一书(中文版《利用程序调试技术》),此书中对换试器从原理到利用都有很全面的讲授.
[1] 用户态调试器构造初探
用户态调试器直接利用Win32 API供应的调试接口,遵守Win32的事件驱动的计划思惟,其实现思绪非常简单,基本框架伪代码以下:
以下为引用?lt;/B>
//启动要调试的进程或挂接调试器到已运行的进程上
CreateProcess(..., DEBUG_PROCESS, ...) or DebugActiveProcess(dwProcessId)
DEBUG_EVENT de;
BOOL bContinue = TRUE;
DWORD dwContinueStatus;
while(bContinue)
{
bContinue = WaitForDebugEvent(&de, INFINITE);
switch(de.dwDebugEventCode)
{
...
default:
{
dwContinueStatus = DBG_CONTINUE;
break;
}
}
ContinueDebugEvent(de.dwProcessId, de.dwThreadId, dwContinueStatus);
}
在调试器开始调试的时刻,会启动被调试程序的新进程大概挂接(attach)到一个已运行进程上,此时Win32系统会启动调试接口的服务器端;然后调试器调用WaitForDebugEvent函数等候调试服务器端的调试事件被引发;调试器按照调试事件举行呼应的处理;最后调用ContinueDebugEvent函数恳求调试服务器持续履行被调试进程,以等候并处理下一个调试事件.
首先我们大致看看调试接口的服务器端的实现思绪:调试服务的服务器端接口实际上是存在于被调试进程的调试端口(Debug Port),此核心对象实现上跟Win32的完成端口近似,都是通过一个核心行列实现的LPC端口.启动调试服务器实际上就是挂接Win32的调试子系统到被调试进程,并在被调试进程内构造调试端口.调试器通过调试端口与Win32的调试子系统通讯;调试子系统呼应系统操作所引发的调试事件,并通过调试端口将调试事件分发给核心态/用户态调试器.
成立被调试程序的新进程时,需求在CreateProcess函数的dwCreationFlags参数设置DEBUG_ONLY_THIS_PROCESS或DEBUG_PROCESS标志位,以表示新建的进程需求被调试.CreateProcess函数的调用处径以下
以下为引用:
CreateProcessA/CreateProcessW (kernel32.dll)
CreateProcessInternalW (kernel32.dll)
NtCreateProcessEx (ntoskrnl.dll)
PspCreateProcess (ntos\ps\create.c:969)
以上是“Win32调试接口计划与实现浅析[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |