Re: IDebugControl下断的问题
C/C++本地代码调试
IDebugControl下断的问题
robinking
2009-04-15, 17:04 下午
大家帮我分析一下
MFC 按钮1 事件处理方法中{
Hr = DebugClient->CreateProcessAndAttach (0,"c:\\windows\\notepad.exe",DEBUG_PROCESS,0,DEBUG_ATTACH_NONINVASIVE);
Hr = DebugClient->QueryInterface (__uuidof(IDebugControl),(void **)&g_ExtControl);
Hr = DebugClient->SetEventCallbacks (&myCallBacks);
hr = g_ExtControl->WaitForEvent (0,1000);
}
按钮2 处理方法
{
g_ExtControl->OpenLogFile("c:\\111.log",true);
//DbgUiRemoteBreakin
//Hr = g_ExtControl->SetInterrupt (DEBUG_INTERRUPT_ACTIVE);
Status = g_ExtControl->Execute (DEBUG_OUTCTL_LOG_ONLY,"bp MessageBoxW",DEBUG_EXECUTE_NOT_LOGGED);
//上一行的代码执行完就会在c:\111.log写下日志,内容如下:
/* 111.log 内容
Opened log file 'c:\111.log'
WARNING: The debugger does not have a current process or thread
WARNING: Many commands will not work
^ Illegal thread error in 'bp MessageBoxW'
*/
}
这个错误是什么意思呢,是说我没有Attach 成功,还是说我没有把目标中断下来,怎么让系统中断下来呢?IDebugClient或IDebugControl有相关的方法吗?
Re: IDebugControl下断的问题
格蠹老雷
2009-04-15, 22:03 下午
是因为你指定了DEBUG_ATTACH_NONINVASIVE标志,这个标志意味着开始一个非入侵式调试会话(《软件调试》P925),这样的调试会话是不可以设置断点和进行跟踪的。
Re: IDebugControl下断的问题
robinking
2009-04-17, 18:41 下午
非常感谢张老师,在完成一系列方法调用完成后一定用Hr = g_ExtControl->WaitForEvent (0,INFINITE);使系统开始事件处理。(如果这里不使用INFINITE,而是2000,则两秒后被调试程序挂起)
当别调试程序处于运行状态时,按F12即可激发回调函数Exception的执行,在此处进行处理:
HRESULT MyCallBacks::Exception(__in PEXCEPTION_RECORD64 Exception, __in ULONG FirstChance ) {
::HRESULT Status;
if( FirstChance != 0 ){
Status = g_ExtControl->Execute (DEBUG_OUTCTL_LOG_ONLY,"r eip;u eip",DEBUG_EXECUTE_ECHO);
//g_ExtControl->SetExecutionStatus(DEBUG_STATUS_GO );
return DEBUG_STATUS_GO;
}
return S_OK;
}
这里就可以 u EIP 命令执行就没有错误了。
另外在书中看到了几个异步阻断的方法,不知道IDebugClient,IDebugControl有没有方法调用异步阻断,等有时间在研究下,谢谢张老师!!