내 고유 벡터 처리 예외 처리기 (VEH)를 등록하고 프로세스에서 StackOverflow 예외가 발생한 경우 VEH에 도달하면 더 많은 데이터를 할당 할 수 있습니까? 스택에 메모리가 있습니까? 할당으로 인해 다른 메모리를 무시하게됩니까? 무슨 일이 일어날 것?
.NET에서이 점은 전체 스택이 스레드 생성 중에 커밋된다는 것을 알고 있습니다.하지만 내가 네이티브로 작성하고 있다고 가정 해 봅시다. 시나리오가 발생했습니다 ... VEH 내부에서 무엇을 할 수 있습니까? 어떤 메모리 할당 ..?StackOverflowException 동안 벡터화 된 예외 처리
답변
스택 오버 플로우의 경우 작업 할 스택이 약간 있습니다. 완전히 새로운 스택을 가질 새 스레드를 시작하기에 충분한 스택입니다. 거기에서 종료하기 전에해야 할 일을 모두 할 수 있습니다.
스택 오버플로에서 복구 할 수는 없지만 스택을 푸는 것이 포함되지만 진행 중에 전체 프로그램이 파괴됩니다. 여기에 내가 스택 덤핑 유틸리티 쓴 일부 코드입니다 : 스택 덤핑 메커니즘, 덤프 덤핑/로깅을 할 새 스레드를 시작하는 스레드 알고 있도록 모든이가 한
// 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()
이처럼 보였다 함수 호출 제거). 반대로 예외를 던질 수는 없습니다. 뿐만 아니라 더 많은 작업이 필요할뿐만 아니라 소멸자도 복잡한 경향이있는 (메모리 할당 해제와 같은) 꽤 많은 작업을 수행 할 수 있습니다.
가장 좋은 방법은 새 스레드를 시작하고 가능한 한 응용 프로그램에 대한 많은 정보를 저장 한 다음 종료하는 것입니다.
스택은 인접해야하므로 임의의 임의 메모리를 할당 할 수는 없지만 주소 공간의 다음 부분을 할당해야합니다.
주소 공간을 미리 할당하려는 경우 (실제로 메모리를 할당하지 않고 주소 범위를 예약하는 경우) VirtualAlloc을 사용할 수 있습니다. 먼저 MEM_RESERVE 플래그를 사용하여 주소 공간을 따로 지정합니다. 나중에 예외 처리기에서 MEM_COMMIT을 사용하여 다시 호출하여 미리 예약 된 주소 공간에 실제 메모리를 할당 할 수 있습니다.
아니요, 벡터 처리 예외 처리기에서 메모리를 할당 할 수 없습니다.
MSDN 명시 적으로 말한다.
"핸들러는 동기화 개체를 획득하거나 문제를 일으킬 수 있기 때문에 는, 메모리를 할당 할 전화 기능는 일반적으로, 핸들러는 단순히 예외 기록 및 반환에 액세스해야 . "
- 1. .NET에서 StackOverflowException
- 2. 계층화 된 아키텍처에서 예외 처리
- 3. PostSharp 처리 예외 처리
- 4. 벡터화
- 5. 예외 예외 처리 WCF + Silverlight
- 6. C# StackOverflowException
- 7. 예외 처리
- 8. 처리 예외 처리
- 9. 벡터화 된 문장에서 R 합산
- 10. 메모리 부족 예외 처리
- 11. 예외 처리 성능
- 12. 예외 처리
- 13. 예외 처리
- 14. 예외 처리
- 15. 예외 처리
- 16. 예외 처리
- 17. 예외 처리
- 18. DllImport StackOverflowException
- 19. Objective-C에서 예외 처리
- 20. 예외 처리 : throw 된 후에 마침내 실행됩니까?
- 21. 리스너에 의해 throw 된 Java 예외 처리
- 22. 다형성을 통한 예외 처리
- 23. 자바 예외 처리 메서드
- 24. 예외 처리 도움말
- 25. 여러 예외 처리
- 26. 경고 상자에 예외 처리
- 27. wxWidgets 예외 처리
- 28. NHibernate 예외 처리
- 29. DB2 예외 처리
- 30. C는 예외 처리 ++ 문
"스택 오버플로 예외"의 전체적인 생각은 내가 원래 예약 한 것보다 더 많은 메모리를 스택에 할당한다는 것입니다. 그래서 그 예약 된 크기를 넘어 갔다 경우 stackoverflow 예외가 throw됩니다 및 VEH .. 도착할거야하지만 그 경우 스택에 더 많은 메모리를 할당 할 수 있습니까? (나는 VEH의 몸 안에 있음을 의미한다) –