설정
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 덤프 파일이 생성 됩니다.
3. 생성된 덤프 파일을 해당 vs버전을 선택 하여 엽니다.
4. 네이티브 전용(으)로 디버그 선택합니다.
5. 선택 후 화면
'MFC and C++' 카테고리의 다른 글
어셈블리어 (0) | 2022.06.16 |
---|---|
Window program의 기본 개념 (0) | 2022.06.15 |
댓글