通过写代码,attach程序中创建的其他进程,将其加入VS的Debugger,以方便调试
2010-07-06 00:06
555 查看
主要功能函数:AttachProcess,DettachProcess
AttachProcess将进程加入到debugger以方便调试,
DettachProcess杀掉进程。
使用方法:在需要调试时调用AttachProcess,在中断调试时调用DettachProcess杀掉进程。
函数实现:
/**
把进程attch给debugger
lpWndName,进程的窗口名字
*/
DWORD AttachProcess(LPCWSTR lpWndName)
{
HWND hWnd = NULL;
DWORD hInstance = -1;
hWnd = FindWindow(NULL, lpWndName); //根据进程窗口名字找到进程窗口句柄
if (NULL != hWnd)
{
GetWindowThreadProcessId(hWnd, &hInstance); //根据进程窗口句柄获取进程的PID
if (hInstance > 32)
{
if (0 == DebugActiveProcess((DWORD)hInstance)) //将进程attach给debugger
{
printf("debug active process failed!");
}
else
{
printf("debug active process success!");
}
}
}
return hInstance; // 返回进程PID
}
/**
根据进程的PID,杀掉进程
*/
void DettachProcess(DWORD hInstance)
{
HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, hInstance); //根据进程PID获取进程句柄
TerminateProcess(hProcess, 0); //根据进程句柄杀掉进程,这样与debugger就分开了
}
测试工程,请到我的资源列表中下载,《一个简单的可以Debug用CreateProcess创建的进程例子》。
例子工程源码地址:http://download.csdn.net/source/2519155
现贴出主要测试代码mainfrm.cpp
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "test.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
/**
把进程attch给debugger
lpWndName,进程的窗口名字
*/
DWORD AttachProcess(LPCWSTR lpWndName)
{
HWND hWnd = NULL;
DWORD hInstance = -1;
hWnd = FindWindow(NULL, lpWndName); //根据进程窗口名字找到进程窗口句柄
if (NULL != hWnd)
{
GetWindowThreadProcessId(hWnd, &hInstance); //根据进程窗口句柄获取进程的PID
if (hInstance > 32)
{
if (0 == DebugActiveProcess((DWORD)hInstance)) //将进程attach给debugger
{
printf("debug active process failed!");
}
else
{
printf("debug active process success!");
}
}
}
return hInstance; // 返回进程PID
}
/**
根据进程的PID,杀掉进程
*/
void DettachProcess(DWORD hInstance)
{
HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, hInstance); //根据进程PID获取进程句柄
TerminateProcess(hProcess, 0); //根据进程句柄杀掉进程,这样与debugger就分开了
}
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
static DWORD hInstance = -1;
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
::ShellExecute(NULL, L"open", L"F://projects//test//debug//test3.exe", NULL, NULL, SW_SHOW); // 启动test3.exe
//等待test3.exe启动完毕
while(1)
{
HWND hWnd = ::FindWindow(NULL, L"test3");
if (hWnd != NULL)
{
break;
}
}
}
CMainFrame::~CMainFrame()
{
//如果调用了DebugSetProcessKillOnExit(FALSE),则调用下面的函数将attatch上的进程干掉
DettachProcess(hInstance);
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar/n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar/n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
hInstance = AttachProcess(L"test3"); // 将test3.exe加入调试
//DebugSetProcessKillOnExit(FALSE); // 调试结束或是中断,并不关闭test3.exe,VS默认调试结束时会关闭其attach上的进程
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CMDIFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CMDIFrameWnd::Dump(dc);
}
#endif //_DEBUG
// CMainFrame message handlers
以下测试结果截图,test3.exe已经被我们写的code加入到了VS调试器中,如果test3.exe程序的调试也存在,就可以进入到test3.exe进行调试了。
AttachProcess将进程加入到debugger以方便调试,
DettachProcess杀掉进程。
使用方法:在需要调试时调用AttachProcess,在中断调试时调用DettachProcess杀掉进程。
函数实现:
/**
把进程attch给debugger
lpWndName,进程的窗口名字
*/
DWORD AttachProcess(LPCWSTR lpWndName)
{
HWND hWnd = NULL;
DWORD hInstance = -1;
hWnd = FindWindow(NULL, lpWndName); //根据进程窗口名字找到进程窗口句柄
if (NULL != hWnd)
{
GetWindowThreadProcessId(hWnd, &hInstance); //根据进程窗口句柄获取进程的PID
if (hInstance > 32)
{
if (0 == DebugActiveProcess((DWORD)hInstance)) //将进程attach给debugger
{
printf("debug active process failed!");
}
else
{
printf("debug active process success!");
}
}
}
return hInstance; // 返回进程PID
}
/**
根据进程的PID,杀掉进程
*/
void DettachProcess(DWORD hInstance)
{
HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, hInstance); //根据进程PID获取进程句柄
TerminateProcess(hProcess, 0); //根据进程句柄杀掉进程,这样与debugger就分开了
}
测试工程,请到我的资源列表中下载,《一个简单的可以Debug用CreateProcess创建的进程例子》。
例子工程源码地址:http://download.csdn.net/source/2519155
现贴出主要测试代码mainfrm.cpp
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "test.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
/**
把进程attch给debugger
lpWndName,进程的窗口名字
*/
DWORD AttachProcess(LPCWSTR lpWndName)
{
HWND hWnd = NULL;
DWORD hInstance = -1;
hWnd = FindWindow(NULL, lpWndName); //根据进程窗口名字找到进程窗口句柄
if (NULL != hWnd)
{
GetWindowThreadProcessId(hWnd, &hInstance); //根据进程窗口句柄获取进程的PID
if (hInstance > 32)
{
if (0 == DebugActiveProcess((DWORD)hInstance)) //将进程attach给debugger
{
printf("debug active process failed!");
}
else
{
printf("debug active process success!");
}
}
}
return hInstance; // 返回进程PID
}
/**
根据进程的PID,杀掉进程
*/
void DettachProcess(DWORD hInstance)
{
HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, hInstance); //根据进程PID获取进程句柄
TerminateProcess(hProcess, 0); //根据进程句柄杀掉进程,这样与debugger就分开了
}
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
static DWORD hInstance = -1;
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
::ShellExecute(NULL, L"open", L"F://projects//test//debug//test3.exe", NULL, NULL, SW_SHOW); // 启动test3.exe
//等待test3.exe启动完毕
while(1)
{
HWND hWnd = ::FindWindow(NULL, L"test3");
if (hWnd != NULL)
{
break;
}
}
}
CMainFrame::~CMainFrame()
{
//如果调用了DebugSetProcessKillOnExit(FALSE),则调用下面的函数将attatch上的进程干掉
DettachProcess(hInstance);
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar/n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar/n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
hInstance = AttachProcess(L"test3"); // 将test3.exe加入调试
//DebugSetProcessKillOnExit(FALSE); // 调试结束或是中断,并不关闭test3.exe,VS默认调试结束时会关闭其attach上的进程
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CMDIFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CMDIFrameWnd::Dump(dc);
}
#endif //_DEBUG
// CMainFrame message handlers
以下测试结果截图,test3.exe已经被我们写的code加入到了VS调试器中,如果test3.exe程序的调试也存在,就可以进入到test3.exe进行调试了。
![](http://hi.csdn.net/attachment/201007/5/0_1278346765h8An.gif)
相关文章推荐
- AutoCAD2013 + VS2015,不可以直接在“调试”中直接启动外部程序的方式来调试,只能通过在解决方案中加入acad.exe并将acad.exe为启动项
- VS 通过 附加进程的方式来调试 C#服务程序
- VS调试C程序跳转至_debugger_hook_dummy = 0;
- 进程控制:创建执行其他程序的进程
- VS通过添加到进程调试时没法选择w3wp.exe的解决办法
- VS 使用自带的.NET Reflector单步调试编译好的程序集(反编译),以及相关其他反编译程序介绍
- 如何启动一个程序一附加命令行选项启动(创建进程以命令行附加方式 配置 其他启动项)
- # include <errno.h >查看错误代码errno是调试程序的一个重要方法。当Linux C API函数发生异常时,一般会将errno变量赋值一个整数,不同的值表示不同的含义,可以通过查看
- php进程管理--手动创建进程锁,防止重复执行某程序代码
- 调试Javascript代码(浏览器F12及VS中debugger关键字)
- c#通过纯代码创建桌面快捷方式、创建程序菜单项、将网页添加到收藏夹
- vs2010 修改程序代码,调试程序时,“当前不会命中断点,源代码与原始版本不同。” 的解决方案, 及vs调试时,不能修改源代码的解决方案。
- vs2013附加到进程,调试本机代码
- 通过js引用外部脚本(嘿嘿,方便直接在浏览器上调试抓取代码)
- 【第一阶段 指令集】仿真器上的第一个程序汉诺塔 汇编代码调试通过
- 调试Javascript代码(浏览器F12及VS中debugger关键字)
- 包含别人的dll,然后我们用类库再次封装成dll的时候的注意事项;源文件与模块生成时的文件不同;创建调试信息文件 ··PDB时发生意外的错误,进程无法访问文件,因为另一个程序正在使用此文件
- VS使用进程调试出现“没有正确安装调试器。请运行安装程序安装或修复调试器”的错误,解决方法。
- 在SunOS8上调试通过的获取指定进程信息的程序
- 获取本机MAC地址,创建GUID,硬盘序列号,vs2013代码通过验证