2014-10-20 3 views
5

내 Qt 응용 프로그램의 Windows 빌드에 미니 코어 덤프 기능 (__try/__ except 및 MiniDumpWriteDump())을 추가하여 내 응용 프로그램이 충돌 한 경우 .dmp 파일이 쓰여지도록했습니다 나중에 나를보고 디버깅 할 수 있도록 디스크에 저장하십시오.의도적으로 내 Windows 응용 프로그램을 충돌시키는 가장 좋은 방법은 무엇입니까?

잘 작동하지만 테스트를 위해 신뢰할 수있는 방법으로 내 프로그램을 중단하고 싶습니다. 예를 들어 GUI에 "지금 충돌"버튼이있을 수 있으며 사용자가 클릭하면 응용 프로그램이 의도적으로 중단됩니다.

방법 중 하나는해야 할 일이, 물론, 같은 수 있습니다 :

int * badPointer = NULL; 
*badPointer = 666; 

을 그리고 나를 위해 작동하지만,이 정의되지 않은 동작에 의존하기 때문에 나는 그 방법 좋아하지 않는다 - 특히, C++ 표준은 이 아니기 때문에 위의 코드가 인 경우 충돌이 발생할 수 있으므로 위의 코드가 실행될 때 이후 버전의 컴파일러가 다운되지 않을 수 있습니다 (언어 변호사의 관점에서 볼 수 있음). 더 "공식적인"접근 방식으로

, 나는이 시도 : 프로그램을 종료 않지만, 아니 그래서, MiniCrashDump 핸들러를 트리거 윈도우 구조적 예외가 발생하지 않습니다

abort(); 

... .dmp 파일이 작성됩니다.

내 질문에 내 프로그램이 중단되는 "공식적인 올바른 방법"이 있습니까? 나는 Windows API가 호출 할 수있는 RaiseException() 함수를 가지고 있지만, 적절한 인수가 무엇인지 잘 모르겠습니다. 그게 가야할 길인가, 아니면 내가 사용하는 것이 더 낫다는 좀 더 구체적인 전화가 있나?

+0

화면을 통해 해머. –

+1

많이 구현 된 키워드와 동작을 사용하고 있으며 언젠가 C++ 사양에서 언젠가는 무엇을 말할지 걱정됩니까 ?? 물론, RaiseException()은 공식적인 방법입니다. –

+0

@HansPassant MSVC 최적화 도구만큼 나에게 걱정스러운 C++ 스펙이 아닙니다. "badPointer가 NULL이라는 것을 알기 때문에 gcc 스타일의 마술 트릭을 시작할 수도 있습니다. NULL 포인터를 역 참조하는 것은 정의되지 않은 동작이므로, 그 쓰레기를 최적화해라. "... 그리고 갑자기 내 충돌 버튼이 더 이상 충돌하지 않는다. :) –

답변

3

Windows에서 실행 중임을 알고있는 경우 널 포인터를 참조 해제하여 액세스 위반이 발생하는 것은 문제가되지 않습니다. Windows는 C++ 언어보다 강력한 보증을 제공합니다. C++에서는 null 포인터를 역 참조하는 것은 Undefined Behavior이지만 Windows는이 값을 액세스 위반으로 정의합니다 (이는 C++이 정의 될 때까지 허용되지 않습니다. 액세스 위반은 정의되지 않은 동작의 한 가지 결과 일 수 있기 때문입니다). Managing Virtual Memory에서

:

Windows NT는 모든 프로세스의 주소 공간에 안전 장치를 구축합니다. 각 프로세스의 상단 및 하단 모두 65,536 바이트는 시스템에 의해 영구적으로 예약됩니다. 어드레스 공간의 이들 부분들은 범위 00000000 -0000FFFF 16 16 또는 16 7FFF0000 -7FFFFFFF 16 메모리를 해결하기위한 시도 트랩 스트레이 포인터 - 포인터를 보유한다. 우연히도이 주소에서 하위 4 개의 니블 (가장 오른쪽에있는 2 바이트)을 무시하면이 범위의 포인터를 쉽게 감지 할 수 있습니다. 본질적으로, 상위 네 개의 니블이 0000 또는 7FFF 인 경우 포인터가 유효하지 않습니다. 다른 모든 값은 유효한 주소를 나타냅니다. 당신이 읽거나 널 포인터 (또는 널 포인터의 +/- 64킬로바이트 내의 포인터)에 쓰기를 시도하면, 당신은 항상 올릴 것 때문에

는 메모리의 첫 페이지는 항상 PAGE_NOACCESS로 매핑된다 액세스 위반 예외입니다.

관련 문제