본문 바로가기

프로그래밍/기타정보

BUGTRAP 적용관련 예외처리

버그트랩에서 잡지 못하는 예외처리 정리


//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);

}

#include <iostream>
#include <cstdlib>

// function to call if operator new can't allocate enough memory or error arises
void outOfMemHandler()
{
    std::cerr << "Unable to satisfy request for memory\n";

    std::abort();
}

int main()
{
    //set the new_handler
    std::set_new_handler(outOfMemHandler);

    //Request huge memory size, that will cause ::operator new to fail
    int *pBigDataArray = new int[100000000L];

    return 0; 

} 




//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);

}