작은 프로그램을 만들어서 공유하다보면 가끔씩 빡날 때가 생기게 됩니다. 그래서 유용하게 사용되는게 미니덤프 파일인데 운영체제가 XP 라면 왓슨박사에게 말해두면 곧 잘 생기게 됩니다. 그러나 운영체제별로 구별하는 것도 여간 귀찮은 일이 아닙니다. 최대한 간편하면서도 쉽게 생성할 수 있는 방법은 아래와 같이 몇 줄을 C&P 하면 간단하게 하게 생성할 수 있습니다.
BOOL CTrusTestApp::InitInstance()
{
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinAppEx::InitInstance();

	CTrusTestDlg dlg;
	m_pMainWnd = &dlg;

	SetUnhandledExceptionFilter(CustomUnhandledExceptionFilter);

	INT_PTR nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		// TODO:
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO:
	}

	return FALSE;
}
위의 13 라인과 같이 MFC 다이얼로그의 DoModal() 함수 호출 직전에 예외 필터를 하나를 걸어둡니다. 그럼 크래시가 발생할 경우 위의 함수로 제어권이 넘어가게 됩니다. 그 때 아래와 같이 덤프파일을 조용히 생성하고 해당 파일을 수집하면 코드라인 수준으로 디버깅을 할 수 있습니다.
LONG WINAPI CustomUnhandledExceptionFilter(PEXCEPTION_POINTERS pExInfo)
{
	TCHAR szPath[MAX_PATH];
	GetModuleFileName(NULL, szPath, MAX_PATH);
	TCHAR* T = _tcsrchr(szPath, _T('.'));
	if ( T )
	{
		*T = _T('\0');
	}

	StringCchCat(szPath, MAX_PATH, _T(".dmp"));

	HANDLE hFile = CreateFile(
		szPath
		, GENERIC_WRITE
		, 0
		, NULL
		, CREATE_ALWAYS
		, FILE_ATTRIBUTE_NORMAL
		, NULL);

	MINIDUMP_EXCEPTION_INFORMATION eInfo;
	eInfo.ThreadId = GetCurrentThreadId();
	eInfo.ExceptionPointers = pExInfo;
	eInfo.ClientPointers = FALSE;

	MiniDumpWriteDump( GetCurrentProcess()
		, GetCurrentProcessId()
		, hFile
		, MiniDumpNormal
		, &eInfo
		, NULL
		, NULL );

	CloseHandle(hFile);

	TCHAR szMessage[1024];
	StringCchPrintf( szMessage
		, 1024
		, _T("프로그램에 크래시가 발생하였습니다.\n") \
		_T("아래의 경로에 원인을 추측할 수 있는 덤프파일을 생성하였습니다.\n") \
		_T("덤프파일을 담당자에게 전달해주시면 크래시 현상을 제거할 수 있습니다.\n") \
		_T("\n")
		_T("경로 : %s")
		, szPath );

	::MessageBox( GetDesktopWindow(), szMessage, _T("크래시 발생!"), MB_OK | MB_ICONWARNING );

	return EXCEPTION_EXECUTE_HANDLER;
}
다만 릴리즈 할 때, 프로그램 디버깅 정보와 map, pdb 파일을 같이 생성하여 가지고 있어야 합니다.
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기