|
|
|
|
|
|
|
C/C++本地代码调试
帖子发起人: robinking 发起时间: 2009-04-15 17:04 下午 回复: 2
|
帖子排序:
|
|
|
|
2009-04-15, 17:04 下午
|
robinking
注册: 2009-03-27
发 贴: 4
|
|
|
大家帮我分析一下
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有相关的方法吗?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-04-15, 22:03 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
是因为你指定了DEBUG_ATTACH_NONINVASIVE标志,这个标志意味着开始一个非入侵式调试会话(《软件调试》P925),这样的调试会话是不可以设置断点和进行跟踪的。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-04-17, 18:41 下午
|
robinking
注册: 2009-03-27
发 贴: 4
|
|
|
非常感谢张老师,在完成一系列方法调用完成后一定用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有没有方法调用异步阻断,等有时间在研究下,谢谢张老师!!
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » C/C++本地代码调试 » Re: IDebugControl下断的问题
|
|
|
|
|
|