버그트랩에서 잡지 못하는 예외처리 정리
//Out of Memory
//StackOverflow
//c run time error
//Out of Memory 이미 프로세서의 모든 메모리를 사용하여 덤프를 남길순 없는 상태 최대한 로그를 남기는 정식으로유도 (콜스택을 남기라도 하기도함) 어떻게 남길까 로그로 남기지 않을까 unsigned long long i = 0; try { while (true) { // Leaks memory on each iteration as there is no matching delete int* a = new int; i++; } } catch (bad_alloc ex) { cerr << sizeof(int)* i << " bytes: Out of memory!"; cin.get(); exit(1); } |
} |
//StackOverflow 별도의 설명은 없고 SetUnhandledExceptionFilter를 통해 예외 핸들을 받아 버그트랩을 만들어 줍니다. void StackOverflow(int depth) { char blockdata[10000] = ""; printf("Overflow: %d\n", depth); StackOverflow(depth + 1); } long __stdcall ExceptionHandler(PEXCEPTION_POINTERS info) { if (info == NULL) { return EXCEPTION_EXECUTE_HANDLER; } //stack overflow 거 걸리면 스레드 스텍이 다 사용된 것이므로 해당 스레드로는 //덤프를 남길수가 없다. 그래서 새로 스레드를 생성하여 덤프를 남긴다. if (info->ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW) { HANDLE hThread = CreateThread(NULL, 0, WriteDump, info, 0, NULL); WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); } else { WriteDump(info); } return EXCEPTION_EXECUTE_HANDLER; } DWORD WINAPI WriteDump(LPVOID lpParam) { SetupExceptionHandler(); int* ptr = 0; *ptr = 0; // 예외 처리 MessageBox(0, "WriteDump", "Error", MB_OK); HANDLE hCurrentProcess = GetCurrentProcess(); TerminateProcess(hCurrentProcess, ~0u); } winmain { SetUnhandledExceptionFilter(handle_unhandled_exception); StackOverflow(0); } |
//c run time error 이것도 역시 별도의 예외 핸들러를 정의해서 버그트랩을 남기는 방법 여러가지 예외가잇지만 역시 예제의 예외 처리만 정리합니다. c_run_time() { std::vector<int> myVec; myVec.push_back(10); int x = myVec[10]; } winmain { _set_invalid_parameter_handler(handle_invalid_parameter); _set_purecall_handler(handle_pure_call); signal(SIGABRT, handle_signal); } |
'프로그래밍 > 기타정보' 카테고리의 다른 글
Windows 메모리/리소스 누수 디버깅 기법들 (1) | 2016.06.03 |
---|---|
커밋 메시지에 대해 (0) | 2015.11.09 |
VS2010 기준 쓸만한 Extension VisualStudio (0) | 2015.04.16 |
Visual Studio 단축키 (0) | 2015.04.16 |
DXSDK_Jun10.exe 설치 시 "Error Code: S1023" 오류 해결하는 방법 (0) | 2015.02.06 |