반응형

출처 : http://serious-code.net/moin.cgi/CppDebuggingTips#head-542083e07fc1db7784e0c88b48594020973726bd


스택 오버플로우 발생시 덤프 기록하기

    스택 오버플로우 발생시의 덤프 기록은 약간 다르게 처리를 해줘야한다. 어려운 건 아니고, 그냥 다른 스레드를 하나 생성해서 그쪽으로 스레드 핸들과 예외 포인터를 넘겨서 덤프를 기록하면 된다. 현재 스레드에서는 덤프 함수를 호출할 스택마저 모자랄 수 있기 때문이다. 하지만 다른 스레드를 하나 따로 생성하면 새로 생성한 스레드에서는 스택 공간이 충분하기 때문에 덤프를 무사히 기록할 수 있는 것이다. (스택은 스레드별로 유지되니까...)
    typedef struct _DUMP_PARAMETER
    {
        HANDLE              Thread;
        PEXCEPTION_POINTERS ExPtrs;
    } DUMP_PARAMETER, *PDUMP_PARAMETER;
    
    DWORD WINAPI WriteDump(LPVOID param)
    {
        PDUMP_PARAMETER dumpParam = reinterpret_cast<PDUMP_PARAMETER>(param);
        ...여기서 실제 덤프를 수행...
    }
    
    LONG WINAPI HandleException(PEXCEPTION_POINTERS exPtrs)
    {
        if (exPtrs)
        {
            PDUMP_PARAMETER dumpParam = (PDUMP_PARAMETER)malloc(sizeof(DUMP_PARAMETER));
            dumpParam->Thread = GetCurrentThread();
            dumpParam->ExPtrs = exPtrs;
            if (exPtrs->ExceptionRecord->ExceptionCode != EXCEPTION_STACK_OVERFLOW)
            {
                WriteDump(dumpParam);
            }
            else // 스택 오버플로 발생 시에는 별도의 스레드를 생성해서 덤프를 기록한다.
            {
                HANDLE hThread = CreateThread(NULL, 102400, WriteDump, dumpParam, 0, NULL);
                WaitForSingleObject(hThread, INFINITE);
                CloseHandle(hThread);
            }
        }
        return EXCEPTION_EXECUTE_HANDLER;
    }
    
    void main()
    {
        ...
        // 예외 처리 핸들러를 설정한다.
        SetUnhandledExceptionFilter(HandleException);
        ...
    }
     

    1 메모리 디버그 코드

      VisualCpp 메모리 코드

      의미
      0xCD, 0xCDCDCDCD 최초로 할당된 메모리
      0xFD, 0xFDFDFDFD 유저가 할당한 메모리 뒤에 붙는 바운드 체크용 메모리
      0xDD, 0xDDDDDDDD 삭제된 메모리. _CRTDBG_DELAY_FREE_MEM_DF 플래그 값이다.
      0xCC, 0xCCCCCCCC 초기화되지 않은 지역 변수. /GX 옵션을 켜야 한다.
      0xABABABAB LocalAlloc 함수로 할당한 메모리 뒤에 붙는 바운드 체크용 메모리
      0xBAADF00D LocalAlloc 함수로 할당한 메모리
      0xFEEEFEEE HeapAlloc 함수를 위해 확보는 해놨으나, 아직 실제로 할당되지는 않은 메모리. 또는 HeapFree 함수를 통해 해제된 메모리
     

반응형

+ Recent posts