2009-12-13 5 views
1

내 고유 벡터 처리 예외 처리기 (VEH)를 등록하고 프로세스에서 StackOverflow 예외가 발생한 경우 VEH에 도달하면 더 많은 데이터를 할당 할 수 있습니까? 스택에 메모리가 있습니까? 할당으로 인해 다른 메모리를 무시하게됩니까? 무슨 일이 일어날 것?
.NET에서이 점은 전체 스택이 스레드 생성 중에 커밋된다는 것을 알고 있습니다.하지만 내가 네이티브로 작성하고 있다고 가정 해 봅시다. 시나리오가 발생했습니다 ... VEH 내부에서 무엇을 할 수 있습니까? 어떤 메모리 할당 ..?StackOverflowException 동안 벡터화 된 예외 처리

답변

1

스택 오버 플로우의 경우 작업 할 스택이 약간 있습니다. 완전히 새로운 스택을 가질 새 스레드를 시작하기에 충분한 스택입니다. 거기에서 종료하기 전에해야 할 일을 모두 할 수 있습니다.

스택 오버플로에서 복구 할 수는 없지만 스택을 푸는 것이 포함되지만 진행 중에 전체 프로그램이 파괴됩니다. 여기에 내가 스택 덤핑 유틸리티 쓴 일부 코드입니다 : 스택 덤핑 메커니즘, 덤프 덤핑/로깅을 할 새 스레드를 시작하는 스레드 알고 있도록 모든이가 한

// stack overflows cannot be handled, try to get output then quit 
set_current_thread(get_current_thread()); 
boost::thread t(stack_fail_thread); 

t.join(); // will never exit 

스레드의 핸들을 얻을 수 있었다, 그리고 완료 될 때까지 기다리십시오 (스레드가 exit()을 호출 함).

는이 모든 작업에 많은 공간을 필요로 (그리고 명심하지 않는다 "간단한"기능이
const HANDLE process = GetCurrentProcess(); 
HANDLE thisThread = 0; 
DuplicateHandle(process, GetCurrentThread(), process, 
     &thisThread, 0, true, DUPLICATE_SAME_ACCESS); 

, 컴파일러는 이러한 msot 인라인됩니다

완성도를 들어, get_current_thread()이처럼 보였다 함수 호출 제거). 반대로 예외를 던질 수는 없습니다. 뿐만 아니라 더 많은 작업이 필요할뿐만 아니라 소멸자도 복잡한 경향이있는 (메모리 할당 해제와 같은) 꽤 많은 작업을 수행 할 수 있습니다.

가장 좋은 방법은 새 스레드를 시작하고 가능한 한 응용 프로그램에 대한 많은 정보를 저장 한 다음 종료하는 것입니다.

0

스택은 인접해야하므로 임의의 임의 메모리를 할당 할 수는 없지만 주소 공간의 다음 부분을 할당해야합니다.

주소 공간을 미리 할당하려는 경우 (실제로 메모리를 할당하지 않고 주소 범위를 예약하는 경우) VirtualAlloc을 사용할 수 있습니다. 먼저 MEM_RESERVE 플래그를 사용하여 주소 공간을 따로 지정합니다. 나중에 예외 처리기에서 MEM_COMMIT을 사용하여 다시 호출하여 미리 예약 된 주소 공간에 실제 메모리를 할당 할 수 있습니다.

+0

"스택 오버플로 예외"의 전체적인 생각은 내가 원래 예약 한 것보다 더 많은 메모리를 스택에 할당한다는 것입니다. 그래서 그 예약 된 크기를 넘어 갔다 경우 stackoverflow 예외가 throw됩니다 및 VEH .. 도착할거야하지만 그 경우 스택에 더 많은 메모리를 할당 할 수 있습니까? (나는 VEH의 몸 안에 있음을 의미한다) –

0

아니요, 벡터 처리 예외 처리기에서 메모리를 할당 할 수 없습니다.

MSDN 명시 적으로 말한다.

"핸들러는 동기화 개체를 획득하거나 문제를 일으킬 수 있기 때문에 는, 메모리를 할당 할 전화 기능는 일반적으로, 핸들러는 단순히 예외 기록 및 반환에 액세스해야 . "