Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

난 정말 최고야 멋있어

윈도우 예외 처리 본문

카테고리 없음

윈도우 예외 처리

n00bh4cker 2019. 12. 23. 20:11

1. C++ 기본 예외 처리 try ~ catch

=> 윈도우에서 동작시 내부적으로 SEH 이용

어떤 타입이던지 throw 가능 (그래도 웬만하면 std::exception 이용하자)

받을때는 그 타입으로 받으면 된다!

 

2. SEH (Structured Exception Handling)

=> __try __except 문 또는 __try __finally문 을 이용해서 구현 가능

__except() 인자로 어떤 필터를 적용하느냐에 따라서 처리를 다르게 할 수 있음

필터값들은 excpt.h 에 정의 되어 있음

// Defined values for the exception filter expression
#define EXCEPTION_EXECUTE_HANDLER      1
#define EXCEPTION_CONTINUE_SEARCH      0
#define EXCEPTION_CONTINUE_EXECUTION (-1)

 

필터 함수를 만들어서 조건별로 다르게 필터값을 출력하도록 해도 됨..

Like this..

int ExceptionFilter(EXCEPTION_POINTERS* pException)
{
	if (pException->ExceptionRecord->ExceptionCode = EXCEPTION_ACCESS_VIOLATION)
		return EXCEPTION_EXECUTE_HANDLER;
	else
		return EXCEPTION_CONTINUE_SEARCH;
}

이용시에는

__try{
//sth try
}
__except(ExceptionFilter(GetExceptionInformation()))
{
//handling exception
}

참고로 EXCEPTION_POINTERS 구조체는 ExceptionRecord 와 ContextRecord 를 가지고 있는데 상당히 유용하다

 

+ 또는 SetUnhandledExceptionFilter 를 이용하여 SEH 에 등록 할 수도 있다.

모두 SEH 를 이용한다는 것은 같지만, 대신 실행 순서가 약간 다르다

 

3.VEH (Vectored Exception Handling)

	AddVectoredExceptionHandler(true, (PVECTORED_EXCEPTION_HANDLER)vehHandler);
	AddVectoredContinueHandler(true, (PVECTORED_EXCEPTION_HANDLER)continueHandler);
	//todo;
	RemoveVectoredContinueHandler(continueHandler);
	RemoveVectoredExceptionHandler(vehHandler);

vehHandler 와 continueHandler는 SEH 의 필터 함수처럼 만들어 주면 된다..

 

4.예외 처리 순서

1. DBG_CONTINUE

2. VEH

3. SEH (__try ~ ...)

4. SEH (SetUnhandledExceptionFilter)

5. DBG_CONTINUE

6. csrss.exe => 에러 문구 출력