Artigo: 173652 - Última revisão: terça-feira, 21 de Novembro de 2006 - Revisão: 4.4

Erro: Filtro de excepção não processada não foi chamado dentro de depurador

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Processos de Win32 podem instalar uma função de filtro de excepção não processada para chamar excepções que não são processadas numa __try / __except bloco numa base de todo o processo. Quando tal um processo de depuração, irá descobrir que o filtro de excepção não processada é nunca executado, mesmo quando coloca um ponto de interrupção nela. No entanto, quando o processo não está a ser depurado, o filtro de excepção não processada é denominado como previsto.

Causa

Quando chamado a partir de um processo a ser depurado, a função de API do Win32 UnhandledExceptionFilter() não chama o filtro de excepção não processada aplicação instalada.

Nota A API UnhandledExceptionFilter() determina se o processo está a ser depurado. Se o processo está a ser depurado, a API UnhandledExceptionFilter passa a excepção para o depurador. Em seguida, a API UnhandledExceptionFilter chama o filtro de excepção não processada para o processo.

Resolução

UnhandledExceptionFilter deverá chamar o filtro de excepção não processada aplicação instalada para processos que estão a ser depurados além não estiver a ser depurado.

Uma forma para depurar uma função de filtro de excepção não processada é colocar um __try / __except bloco à volta de todo o código no main() ou WinMain() funciona da seguinte forma:
   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");
      }
   }
				
este trabalho volta funciona forma ligeiramente diferente de um filtro de excepção não processada no só será chamado do thread de execução main() ou função WinMain(). Se estiver a depurar uma aplicação com vários threads, terá de adicionar um __try semelhantes / __except bloco dentro de cada função de thread.

Se não quiser adicionar novas __try __except blocos para depurar um filtro de excepção não processada, deverá utilizar outros métodos como, por exemplo rastreio como asserção, exporta e depurar código para validar o comportamento do processador de excepções.

Ponto Da Situação

A Microsoft confirmou que este erro ocorre nos produtos da Microsoft listados no início deste artigo. Estão a investigar este erro e publicará novas informações na base de dados de conhecimento da Microsoft como fica disponível.

Mais Informação

O objectivo de uma função de filtro de excepção não processada é atribuir um processo a oportunidade de responder às excepções que ocorrem fora qualquer __try / __except bloco. Filtros de excepção não processada são todo o processo; se qualquer thread faz com que uma excepção, mas não a processa, irá obter chamado o filtro de excepção não processada. Depois de chamada, a função filtro pode corrigir a causa da excepção e continuar a execução ou pode passar o erro para o suporte de excepção não processada predefinido, que termina o processo.

Aplicações do Win32 podem instalar um filtro de excepção não processada todo o processo com a função de API SetUnhandledExceptionFilter(). O código de arranque do Microsoft Visual C++ C de tempo de execução (CRT) biblioteca implementa um __try / __except bloco volta a função main(). Quando é detectada uma excepção por este bloco, a função de filtro de excepção, nome _XcptFilter, é chamada. _XcptFilter faz duas coisas: mapeia as excepções de Win32 para sinais utilizados pela função signal() CRT e distribui sinais para as respectivas rotinas de tratamento adequadas. Se processador um sinal estiver definido como SIG_DFL (tal como acontece por predefinição), _XcptFilter chama a API UnhandledExceptionFilter().

A API UnhandledExceptionFilter() determina se o processo está a ser depurado. Se for, em seguida, UnhandledExceptionFilter passa a excepção primeiro para o depurador e, em seguida, é suposto para chamar filtro de excepção não processada do processo.

Se o processo não está a ser depurado, UnhandledExceptionFilter chama o filtro de excepção não processada do processo. Consoante a função filtro de devolução, UnhandledExceptionFilter ou continuar a execução no ponto da excepção ou apresenta uma caixa de diálogo modal sistema informando o utilizador de que a aplicação deve ser terminados devido a uma excepção não processada.

Passos para reproduzir o comportamento

Compilar o código de exemplo seguinte e, em seguida, defina um ponto de interrupção dentro MyUnFilter. Observe que o ponto de interrupção nunca é atingido.
   /*
      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;
   }
				

A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Application Programming Interface nas seguintes plataformas
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
Palavras-chave: 
kbmt kbbug kbexcepthandling kbkernbase kbpending KB173652 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 173652  (http://support.microsoft.com/kb/173652/en-us/ )