BUG: 처리되지 않은 예외 필터 디버거 내에서 호출할 수 없습니다.

기술 자료 번역 기술 자료 번역
기술 자료: 173652 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

현상

Win32 프로세스 처리되지 않은 예외를 catch 있는 __try/프로세스 차원의 단위로 블록 __except 처리되지 않은 예외 필터 함수를 설치할 수 있습니다. 이러한 프로세스를 디버깅하는 경우 심지어 안에 중단점의 넣을 때 처리되지 않은 예외 필터 안 함, 실행되도록 찾습니다. 그러나 프로세스를 디버깅할 때 예상한 대로 처리되지 않은 예외 필터가 호출됩니다.

원인

디버깅 중인 프로세스에서 호출할 때 응용 프로그램이 설치된 처리되지 않은 예외 필터 UnhandledExceptionFilter() Win32 API 함수를 호출하지 않습니다.

참고 UnhandledExceptionFilter() API 프로세스가 디버깅되고 있는지 여부를 결정합니다. 프로세스를 디버깅할 경우 UnhandledExceptionFilter API 디버거에 예외를 전달합니다. 그런 다음 UnhandledExceptionFilter API 프로세스에 대해 처리되지 않은 예외 필터를 호출합니다.

해결 방법

UnhandledExceptionFilter 응용 프로그램을 설치한 처리되지 않은 예외 필터 외에 디버깅 중인 디버깅 중인 프로세스에 대해 호출해야 합니다.

처리되지 않은 예외 필터 함수를 디버깅하려면 한 방법입니다 있는 __try 넣기/__except 블록의 모든 main() 또는 WinMain() 내부에 코드를 해결하려면 다음과 같이 작동할 수:
   void main (int argc, char **argv)
   {
      __try
      {
      // all of code normally inside of main or WinMain here...

      }
      __except (MyUnFilter (GetExceptionInformation()))
      {
         OutputDebugString ("executed filter function\n");
      }
   }
				
경우에만 main() 또는 WinMain() 함수를 실행하는 스레드에서 호출될 점에서 이 작업 약 약간 다르게 처리되지 않은 예외 필터에서 작동합니다. 다중 스레드 응용 프로그램을 디버깅하는 경우 유사한 __try 추가해야 합니다/블록 내부의 각 함수의 스레드 __except.

원하지 않는 경우 새로 추가하려면 __try/처리되지 않은 예외 필터에서 디버깅하려면 __except 블록의 예: assert 같이 추적 다른 방법을 사용해야 합니다 출력하고, 예외 처리기의 동작의 유효성을 검사할 코드 디버깅.

현재 상태

Microsoft는 이 문서의 시작 부분에 나열한 제품에서 버그가 수 있도록 이 확인했습니다. 우리는 이 버그를 연구하고 대로 Microsoft 기술 자료에서 새 정보를 게시할 예정입니다.

추가 정보

처리되지 않은 예외 필터 함수 목적은 프로세스 외부의 모든 __try/__except 블록의 발생하는 예외에 응답할 수 있도록 지정할 수 있습니다. 처리되지 않은 예외 필터의 프로세스 차원, 처리되지 않은 예외 필터 호출되는 모든 스레드에서 예외가, 있지만 처리하지 않습니다. 일단 호출되면 필터 함수가 있습니다 예외의 원인을 해결한 다음, 계속 또는 프로세스가 종료될 기본 처리되지 않은 예외 처리기가 오류를 전달할 수 있습니다.

Win32 응용 프로그램 프로세스 차원의 처리되지 않은 예외 필터 SetUnhandledExceptionFilter() API 함수로 설치할 수 있습니다. Microsoft Visual C++ 런타임 CRT (C) 라이브러리를 시작 코드가 있는 __try 구현하는/__except 블록의 main() 함수 주위에. 이 블록은 예외가 catch되지 때 _XcptFilter, 명명된 해당 예외 필터 함수가 호출됩니다. _XcptFilter 두 가지 작업을 수행합니다: 신호를 signal() CRT 함수에서 사용하는 Win32 예외를 매핑하는 및 해당 적절한 처리기에 신호를 디스패치합니다. 경우 (기본적으로 경우처럼) SIG_DFL 수 있는 신호 처리기를 설정할 _XcptFilter UnhandledExceptionFilter() API를 호출합니다.

UnhandledExceptionFilter() API 프로세스가 디버깅되고 있는지 여부를 결정합니다. 비동기인 경우 다음 UnhandledExceptionFilter 예외가 먼저 디버거에, 전달하고 프로세스의 처리되지 않은 예외 필터 호출하려면 다음 예상되는.

프로세스가 디버깅되지 않은 UnhandledExceptionFilter 프로세스의 처리되지 않은 예외 필터를 호출합니다. 필터 함수에 따라 반환, UnhandledExceptionFilter 예외 지점으로 맨 계속 또는 응용 프로그램에서 처리되지 않은 예외로 인해 종료할 수 있는 사용자가 시스템 모달 대화 상자를 표시합니다.

문제를 재현하기 위한 단계

다음 예제 코드를 컴파일하고 MyUnFilter 내부에 중단점을 설정하십시오. 중단점이 적중될 가져옵니다 절대로 관찰하십시오.
   /*
      Demonstrates how to use SEH so that unhandled exception filter
      can trap unhandled instructions.
   */ 

   #include <windows.h>
   #include <stdio.h>

   LONG WINAPI MyUnFilter (struct _EXCEPTION_POINTERS *lpExceptionInfo);

   void main (void)
   {
      LPBYTE lpBuff = NULL;

      SetUnhandledExceptionFilter (MyUnFilter);

      *lpBuff = 54;
   }


   LONG WINAPI MyUnFilter (struct _EXCEPTION_POINTERS *lpExceptionInfo)
   {
      static int s_SigCount = 0;

      DWORD dwExceptCode = lpExceptionInfo -> ExceptionRecord ->
                           ExceptionCode;
      LONG  lResult;

      if (dwExceptCode == EXCEPTION_ACCESS_VIOLATION)
      {
         printf ("access violation caught by MyUnFilter\n");

         ++s_SigCount;

         // test case to keep this from going on forever (since we're not
         // fixing the AV)
            if (s_SigCount < 5)
               lResult = EXCEPTION_CONTINUE_EXECUTION;
            else
               lResult = EXCEPTION_EXECUTE_HANDLER;

      }
      else
         lResult = EXCEPTION_CONTINUE_SEARCH;

      return lResult;
   }
				

속성

기술 자료: 173652 - 마지막 검토: 2006년 11월 21일 화요일 - 수정: 4.4
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Win32 Application Programming Interface?을(를) 다음과 함께 사용했을 때
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 서비스 팩 5
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
키워드:?
kbmt kbbug kbexcepthandling kbkernbase kbpending KB173652 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com