调试器基础

本文介绍了在Windows环境中如何使用API CreateProcess创建一个调试器,重点在于如何监听并处理被调试程序的异常事件,包括DLL加载和线程创建等调试消息。通过示例代码展示了如何编写一个基础的调试器,针对不同类型的异常进行响应。

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

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);

 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值