2010-04-13 2 views
7

실패 :가 0xc0000005 : 액세스 위반 쓰기 위치를 0x00000000 Test.exe라는에서 0x13929384 에서64 비트 예외는 자동으로 다음 코드는 윈도우 7 32 비트에서 실행 때 하드 실패 할 줄 것이다

첫 번째 예외. 0xC0150010 : Test.exe라는에 0x77c6ee42 에서
첫 번째 예외 활성화 컨텍스트 가 현재 스레드의 실행을위한 활성화되지 비활성화된다.

왜 그럴까요? 나는 그것이 하드웨어 예외 (http://msdn.microsoft.com/en-us/library/aa363082.aspx) 인 것을 안다.하지만 32 비트와 64 비트에서 차이가 나는 이유는 무엇일까? 그리고 이런 종류의 오류를 올바르게 처리하기 위해 무엇을 할 수 있습니까? 실제로 덫에 걸리고 고정되어야하기 때문에 Windows는 현재 응용 프로그램에 메시지를 보내고 실행하게합니다 (사용자와 개발자는 실제로 발생한 문제를 완전히 알지 못합니다).

업데이트 :이 우리의 정규 충돌보고 소프트웨어가 SetUnhandledExceptionFilter 사용하지만이의 WndProc 내부 하드웨어 예외 64에서 호출되지 않습니다. 누구, 또는 해결 방법에 대한 정보가 있습니까?

갱신 2 : 나는 마이크로 소프트 연결에서이 문제를보고 한 :
더미가 액세스 위반 예외 풀어진되는 동안 제기되고 또 다른 예외가있다 https://connect.microsoft.com/VisualStudio/feedback/details/550944/hardware-exceptions-on-x64-machines-are-silently-caught-in-wndproc-messages

+0

: 여기에 스택 및 분해는? – jalf

+0

x64 용 컴파일은 실제로 옵션이 아닙니다. 우리 소스 코드는 대략 1 백만 라인의 코드와 상당한 양의 어셈블러로 구성됩니다. 이를 QA 등을 통해 두 개의 개별 빌드를 실행하는 데 드는 추가 비용과 결합하십시오. –

+1

[WindowProc 콜백 함수] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633573%)의 발언 섹션을 참조하십시오. 28v = vs.85 % 29.aspx) – wimh

답변

1

OK, 나는 Microsoft에서 응답을받은 :

안녕하세요,

감사 보고서에 대해. 나는 이 Windows 문제이며 을 발견했습니다. 사용 가능한 핫픽스가 있습니다. 을 설치하려는 픽스에 대해서는 http://support.microsoft.com/kb/976038 을 참조하십시오.

@Skute : 프로그램을 허용 할 필요가있는 경우 가 계속 실행에 프로그램 호환성 관리자가 한 번 에게 점에 유의하고 있음을 항상 허용됩니다 후, 그 혼란의 원인 될 수 있도록 행동 보고 있습니다.

팻 브레너 비주얼 C++ 라이브러리 개발

그래서 해결 방법은 확실 핫픽스가 설치되어 있는지, 또는 __try/__except 블록과 응용 프로그램에서 각각의 WndProc 포장 중 하나입니다.

+0

__try __except는 어디에 사용합니까? C++ 응용 프로그램의 catch 블록에서 WindowProc 예외를 catch 할 수 있습니까? 핫픽스 정보 레지스트리에서 DisableUserModeCallbackFilter를 1로 설정하고 예외가 아니라 FATAL_USER_CALLBACK_EXCEPTION을 얻습니다. – Demion

+0

'WNDPROC' 함수에서'__try'' __except'를 사용하거나'CWnd :: OnMsg' 함수가 될 MFC를 사용하고 있다면 (제 생각에 머리 위가 틀리면 틀릴 수도 있습니다) . –

+0

WindowProc에서 예외를 throw 할 수 있습니까? – Demion

3

. 어떤 음식이 삼키는 지 AV가 사라집니다. 이를 수행하는 코드를 찾아야합니다. 디버그 + 예외, Win32 예외에 대한 던져 상자를 확인하십시오. 디버거가 첫 번째 디버거에서 멈추고 계속됩니다. 다시 멈 추면 호출 스택을 확인하십시오. 만약 당신이 그것을 알아낼 수 없다면 당신의 질문에 그것을 추가하십시오.

+1

활성화 컨텍스트 예외는 AV 예외가 발생할 때만 발생합니다. –

0

우리가이 문제를 해결할 수 있었던 유일한 방법은 응용 프로그램의 각 WndProc 콜백 주위에 __try/__except를 넣는 것입니다. 그런 다음 예외 처리기로 예외를 라우팅합니다. 끔찍하지만 Windows 자체에 문제가있는 것처럼 보입니다. Microsoft에 다시 연락하기를 기다리고 있습니다.

0

문제는 실제로 SEH가 x64에서 어떻게 작동하는지와 관련이 있습니다. 스택이 풀리는 동안 예외가 커널 모드를 통해 되돌아 가야한다면, 디자인 된 동작 인 The case of the disappearing OnLoad exception이 붙어 있습니다. Windows에서 예외를 처리하고 있습니다. 핫 픽스 (hot-fix)는 x86처럼 특정 x64 응용 프로그램을 충돌시키지 않도록하는 방법입니다.

0

나는 이것을 발견하는 숙제를했습니다 : 예외는 Windows에서 발견되었습니다. 단순히 64 비트에 대한 옵션입니다 컴파일 생각하지 않습니다

stack and disassembling when wndproc get called

관련 문제