Lyn
조회 수 26003 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

두번째 방법으로는 CRT의 예외 핸들러에서 UnhandledExceptionFilter로 데이터를 넘겨서 생성하는 방법인데요...
이는 안정적이고 정석적이지만 치명적인 단점으로 CRT에서 던지는 예외가 하나가 아니라는겁니다... 


어쨋든 코드를 보면


#include <Windows.h>
#include <DbgHelp.h>
#include <cstdio>
#include <string>

using namespace std;

#pragma comment(lib, "dbghelp.lib")

LONG __stdcall TopLvFilter(PEXCEPTION_POINTERS pExceptionPointer)
{
	MINIDUMP_EXCEPTION_INFORMATION MinidumpExceptionInformation;
	std::wstring DumpFileName = L"dmpfile.dmp";

	MinidumpExceptionInformation.ThreadId = ::GetCurrentThreadId();
	MinidumpExceptionInformation.ExceptionPointers = pExceptionPointer;
	MinidumpExceptionInformation.ClientPointers = FALSE;

	if (DumpFileName.empty() == true)
	{
		::TerminateProcess(::GetCurrentProcess(), 0);
	}

	HANDLE hDumpFile = ::CreateFile(DumpFileName.c_str(),
		GENERIC_WRITE,
		FILE_SHARE_WRITE,
		nullptr,
		CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL, nullptr);

	MiniDumpWriteDump(GetCurrentProcess(),
		GetCurrentProcessId(),
		hDumpFile,
		MiniDumpNormal,
		&MinidumpExceptionInformation,
		nullptr,
		nullptr);

	::TerminateProcess(::GetCurrentProcess(), 0);

	return 0;
}
void InvalidParameterHandler(const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line, uintptr_t pReserved)
{
	EXCEPTION_POINTERS ExceptionPointer;
	EXCEPTION_RECORD ExceptionRecord;
	_CONTEXT ContextRecord;

	ZeroMemory(&ContextRecord, sizeof(ContextRecord));
	RtlCaptureContext(&ContextRecord);

	ZeroMemory(&ExceptionRecord, sizeof(EXCEPTION_RECORD));
	ExceptionRecord.ExceptionCode = STATUS_INVALID_CRUNTIME_PARAMETER;	
	ExceptionRecord.ExceptionAddress = (PVOID)ContextRecord.Eip;
		
	ExceptionPointer.ExceptionRecord = &ExceptionRecord;
	ExceptionPointer.ContextRecord = &ContextRecord;

	TopLvFilter(&ExceptionPointer);
}
void main()
{
	SetUnhandledExceptionFilter(TopLvFilter);
	_set_invalid_parameter_handler(InvalidParameterHandler);
	atoi(nullptr);	 
}



구조는 간단합니다. RtlCaptureContext 를 이용해서 현재 쓰래드의 Context를 캡쳐 해 오고, 익셉션 코드와 현재 코드가 실행중인 위치를 넘겨 주면 되는데요..
x86 시스템에서 현재 실행중인 위치는 Eip 레지스터에 있기 때문에 캡쳐해온 Context에서 Eip를 
ExceptionAddress로 넘겨 주면 됩니다.


이 방식은 안정적이고 백신이 오진을 할 가능성도 없고 Windows 8 에서도 아무 문제 없이 작동 하지만 ... 위에서 말한것처럼 예외가 이거 하나가 아니라는게 문제가 됩니다.
예를들어 메모리 할당 예외는 _set_invalid_parameter_handler 로 처리 할 수 없습니다. 하지만 어차피 몇개 안되기도 하고 (...) 그냥 몇개 더 만들어주면 될 문제지요.


정말 골때려 지는건 3rd party 에서 SetUnhandledExceptionFilter 를 호출해서 자기껄로 만들어버리는 라이브러리가 있다는겁니다 =_=; 적은 내안에만 있는게 아닌거죠...그래서 첫번째 방법과 두번째 방법을 모두 적용해 두는게 좋다고 생각 합니다


TAG •
?

  1. boostpro 문 닫았네요....

    Date2013.11.02 ByLyn Views24043
    Read More
  2. Visual Studio 2013 새로 추가된 기능 둘러보기

    Date2013.10.28 ByLyn Views19965
    Read More
  3. Microsoft C++ MVP 리워드를 개봉 해 보았습니다.

    Date2013.10.11 ByLyn Views51208
    Read More
  4. MS SQL Server 2012 언인스톨시 Rsfx Driver 의존성으로 인해 언인스톨이 되지 않는 경우

    Date2013.10.09 ByLyn Views20039
    Read More
  5. Visual C++ 2013 RC 추가기능 1. Raw String Literal

    Date2013.10.07 ByLyn Views15866
    Read More
  6. Microsoft VC++ MVP를 받았습니다....

    Date2013.10.02 ByLyn Views15257
    Read More
  7. 서버를 Windows 2012 R2로 교체 하였습니다.

    Date2013.09.29 ByLyn Views22216
    Read More
  8. VS2013 RC 설치해봄

    Date2013.09.28 ByLyn Views14135
    Read More
  9. 현재 MSDN Download Page

    Date2013.09.23 ByLyn Views19678
    Read More
  10. boost::icl::interval_map 원하는대로 변경해서 사용해보기

    Date2013.09.23 ByLyn Views22393
    Read More
  11. MSDN 에 릴리즈된 MS 제품들입니다.

    Date2013.09.10 ByLyn Views20673
    Read More
  12. C Runtime Library Exception Dump 남기기 두번째 방법

    Date2013.06.25 ByLyn Views26003
    Read More
  13. C Runtime Library Exception Dump 남기기 첫번째방법

    Date2013.06.11 ByLyn Views33213
    Read More
  14. Visual Studio 2012 Update2 Offline 설치

    Date2013.04.11 ByLyn Views23645
    Read More
  15. C++11 표준 라이브러리 확장 (cbegin, cend)

    Date2012.10.04 ByLyn Views34612
    Read More
  16. C++11 표준 라이브러리 확장 (string)

    Date2012.09.10 ByLyn Views28467
    Read More
  17. 대기하는 쓰래드 모두 깨우기 (Java의 notifyAll)

    Date2012.09.04 ByLyn Views38090
    Read More
  18. C++ 템플릿 상속에서 베이스 클래스의 멤버에 접근하는 경우의 문제

    Date2012.08.29 ByLyn Views30514
    Read More
  19. [윈도8] 윈도8 구경1

    Date2012.08.17 ByLyn Views26688
    Read More
  20. C++ string&형 인자에 기본값 주기

    Date2012.07.24 ByLyn Views26068
    Read More
Board Pagination Prev 1 ... 2 3 4 5 6 7 ... 8 Next
/ 8