C++

minidump

xaida 2018. 2. 26. 09:19
  1. typedef struct _MinidumpInfo
  2. {
  3.     DWORD threadId;    ///< crash가 발생한 threadId
  4.     EXCEPTION_POINTERS* pException;    ///< 예외 포인터
  5. } MinidumpInfo, *PMinidumpInfo;
  6.  
  7. int ExceptionHandler(EXCEPTION_POINTERS* pException)
  8. {
  9.     if (pException->ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW)
  10.     {
  11.         MinidumpInfo info;
  12.         info.threadId = ::GetCurrentThreadId();
  13.         info.pException = pException;
  14.         // 덤프 찍기용 쓰레드 하나 생성해 주고
  15.         HANDLE hThread = (HANDLE)_beginthreadex(0, THEAD_STACK_SIZE(대략 2메가), CreateMiniDump, &info, 0NULL);
  16.         // 생성 쓰레드가 덤프 끝날 때까지 기다린다
  17.         WaitForSingleObject(hThread, INFINITE);
  18.         CloseHandle(hThread);
  19.     }
  20.     else
  21.     {
  22.         /// 스택 오버플로우가 없는 일반적인 경우의 덤프 처리
  23.     }
  24.     return EXCEPTION_EXECUTE_HANDLER;


dbghelp.dll 의 MiniDumpWriteDump 함수를 이용해서 Dump파일을 생성하고 있다.

도움 될만한 멋진 코드다. 다운받자. (너무 코드량이 많긴하다.ㅋ) 덤프와 더불어 
덤프 파일을 관리하는 코드까지 포함되어 있다.

GUI hung 발생을 감지하는 코드와 뭔가 고급스럽고, 내부를 잘 아시는듯한 분이 짜신 코드다.


결과적으로 모두 같은 코드에 가깝다. ^^ 이 분들중 하나만 분석해도 충분하다. 개인적으로
http://greenfishblog.tistory.com/19 이 분의 코드를 분석정리하는 것을 권한다. ^^


그런데 스택오버플로가 발생하면 dump가 남지 않는다. 어떻게해야하나~