首页
社区
课程
招聘
[求助]如何让调试器忽略指定异常
发表于: 2012-11-12 20:31 2913

[求助]如何让调试器忽略指定异常

2012-11-12 20:31
2913
大家好,我在写一个小的调试器,遇到一个问题就是我想在被调试程序遇到EXCEPTION_ACCESS_VIOLATION异常的时候,让被调试程序执行自己的异常处理程序,我搜索了一下,网上说将ContinueDebugEvent的第三个参数设置为DBG_EXCEPTION_NOT_HANDLED就可以了.可是我测试的结果不管用.
调试起的代码如下:
int _tmain(int argc, _TCHAR* argv[])
{
	EnablePrivilege(SE_DEBUG_NAME);
	DWORD processid;
	cout<<"input processid:";
	cin>>processid;
	if(!DebugActiveProcess(processid))
		return 0;
	DEBUG_EVENT de={0};
	DWORD  dwContinueStatus=DBG_CONTINUE;
	while(::WaitForDebugEvent(&de,INFINITE))
	{
		switch(de.dwDebugEventCode)
		{
			case EXCEPTION_DEBUG_EVENT:
				switch(de.u.Exception.ExceptionRecord.ExceptionCode)
				{
				case EXCEPTION_BREAKPOINT:
					break;
				case EXCEPTION_SINGLE_STEP:
					break;
				case EXCEPTION_ACCESS_VIOLATION:
					printf("access error!\r\n");
					if(de.u.Exception.dwFirstChance)
						ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
					else
						ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE );
					continue;
					break;
				}
				break;
			default:
				break;
		}
		if(!ContinueDebugEvent(de.dwProcessId,de.dwThreadId,dwContinueStatus ))
		{
			break;
		}
	}
	return 0;
}

被调试程序的异常处理程序如下:
static DWORD NewEip;
static DWORD isDebugged;
LONG WINAPI TopUnhandledExceptionFilter(
	struct _EXCEPTION_POINTERS *ExceptionInfo
)
{
	_asm pushad
	AfxMessageBox(_T("进入异常处理函数"));
	ExceptionInfo->ContextRecord->Eip=NewEip;//转移到安全位置
	_asm popad
	return EXCEPTION_CONTINUE_EXECUTION;
}
typedef LPTOP_LEVEL_EXCEPTION_FILTER (_stdcall  *pSetUnhandledExceptionFilter)(
                      LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter 
                      );
pSetUnhandledExceptionFilter lpSetUnhandledExceptionFilter;
void CS1Dlg::OnBnClickedButton3()
{
	lpSetUnhandledExceptionFilter = (pSetUnhandledExceptionFilter)GetProcAddress(LoadLibrary(_T("kernel32.dll")),
  "SetUnhandledExceptionFilter"); 
	lpSetUnhandledExceptionFilter(TopUnhandledExceptionFilter);
	_asm{  //获取这个安全地址
		call me     //方式一,需要NewEip加上一个偏移值
me:
		pop NewEip  //方式一结束
		mov NewEip,offset safe //方式二,更简单
		xor eax,eax
		jmp eax
		//int 3  //触发异常
	}	
	isDebugged=1;
	_asm{
safe:	
	}
	if(1==isDebugged){

	}else{
		
	}	
}

我测试的结果是当被调试程序触发异常的时候,收到两次EXCEPTION_ACCESS_VIOLATION,被调试程序就退出了.
希望高人指点一下.谢谢.

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//