본문 바로가기
MFC and C++

Dump 파일로 디버깅 하기

by 연원랑 2022. 6. 16.

설정 

1. C/C++ -> 일반 -> 디버그 정보 형식 에서 "프로그램 데이터베이스(/Zi)" 로 바꿉니다.

2. C/C++ -> 출력 파일 -> 어셈블러 출력 에서 "어셈블리, 기계어 코드, 소스"로 변경합니다.

3. 링커 -> 디버깅 -> 디버그 정보 생성 에서 "디버그 정보 생성(/DEBUG) or 예" 선택합니다.

4. 링커 -> 디버깅 -> 맵 파일 생성 에서 "예" 선택합니다.

5. 변수값 확인 하려면 일반 -> 최적화 -> 사용 안함 으로 변경합니다.

6. stdafx.h 또는 pch.h 에 다음 코드 추가합니다.

typedef BOOL(WINAPI *MINIDUMPWRITEDUMP)(
    HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,
	CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
	CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
	CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);

extern LONG TopExceptionFilter(LPEXCEPTION_POINTERS pExp);

7. stdafx.cpp 또는 pch.cpp 에 다음 코드 추가합니다.

LONG TopExceptionFilter(LPEXCEPTION_POINTERS pExp)
{
	LONG retval = EXCEPTION_CONTINUE_SEARCH;
	HMODULE hDll = NULL;
	hDll = ::LoadLibrary(_T("DBGHELP.DLL"));
	TCHAR filename[32];
	COleDateTime ct = COleDateTime::GetCurrentTime();
	swprintf_s(filename, L"crash_%04d%02d%02d_%02d%02d%02d.dmp", ct.GetYear(), ct.GetMonth(), ct.GetDay(), ct.GetHour(), ct.GetMinute(), ct.GetSecond());

	if (hDll)
	{
		MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll, "MiniDumpWriteDump");
		if (pDump)
		{
			HANDLE hFile = ::CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
			if (INVALID_HANDLE_VALUE != hFile)
			{
				_MINIDUMP_EXCEPTION_INFORMATION ExInfo;

				ExInfo.ThreadId = ::GetCurrentThreadId();
				ExInfo.ExceptionPointers = pExp;
				ExInfo.ClientPointers = NULL;


				BOOL bOK = pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpWithFullMemory, &ExInfo, NULL, NULL);
				//BOOL bOK = pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);

				if (bOK)
				{
					retval = EXCEPTION_EXECUTE_HANDLER;
				}
				::CloseHandle(hFile);
			}
		}
		::FreeLibrary(hDll);
	}

	return retval;
}

8.프로그램 시작 시 아래 부분 추가합니다.(생성자 부분이나 시작 함수)

SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)TopExceptionFilter);

 

덤프 파일 생성

1. 테스트를 위해 덤프 파일을 고의로 생성 해보겠습니다.

오류를 만들기 위해 프로그램 시작 부분에 다음과 같이 설정 합니다.

2. 프로그램(Dumptest.exe) 실행 하면 crash 덤프 파일이 생성 됩니다.

crash 덤프 파일이 생성되었습니다.

3. 생성된 덤프 파일을 해당 vs버전을 선택 하여 엽니다.

4. 네이티브 전용(으)로 디버그 선택합니다.

5. 선택 후 화면

해당 오류가난 부분에 중단점이 걸리며 각각의 변수 값 확인도 가능합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'MFC and C++' 카테고리의 다른 글

어셈블리어  (0) 2022.06.16
Window program의 기본 개념  (0) 2022.06.15

댓글