ID do artigo: 173652 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 4.4

Erro: Filtro de exceção sem tratamento não 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 | Recolher tudo

Sintomas

Processos de Win32 podem instalar uma função de filtro de exceção sem tratamento para capturar exceções que não são tratadas em um __try / __except bloco em todo o processo. Quando estiver depurando um processo, você encontrar o que o filtro de exceção não tratada nunca é executado, mesmo quando você colocar um ponto de interrupção dentro dele. No entanto, quando o processo não está sendo depurado, seu filtro de exceção sem tratamento é chamado conforme o esperado.

Causa

Quando chamado de um processo que está sendo depurado, a função de API do Win32 UnhandledExceptionFilter() não chama o filtro de exceção não tratada aplicativo instalado.

Observação A API UnhandledExceptionFilter() determina se o processo está sendo depurado. Se o processo está sendo depurado, a API UnhandledExceptionFilter passa a exceção para o depurador. Em seguida, a API UnhandledExceptionFilter chama o filtro de exceção sem tratamento para o processo.

Resolução

UnhandledExceptionFilter deve chamar o filtro de exceção não tratada aplicativo instalado para processos que estão sendo depurados em adição aos que não sendo depurado.

Uma maneira para depurar uma função de filtro de exceção sem tratamento é colocar um __try / __except bloco ao redor de todo o código dentro do main() ou WinMain() funciona da seguinte maneira:
   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 em torno comportamento um pouco diferente de um filtro de exceção sem tratamento em que ele só será chamado para o thread executar main() ou função WinMain(). Se você está depurando um aplicativo multithreaded, você precisará adicionar um __try semelhante / __except bloco dentro de cada função de thread.

Se não desejar adicionar novo __try __except blocos para depurar um filtro de exceção não tratada, você deve usar outros métodos, como assert, rastrear saídas e depuração de código para validar o comportamento do manipulador de exceção.

Situação

A Microsoft confirmou este é um bug em produtos Microsoft listados no começo deste artigo. Nós estiver pesquisando esse bug e irá postar novas informações aqui na Base de dados de Conhecimento da Microsoft como ele se torna disponível.

Mais Informações

A finalidade de uma função de filtro de exceção não tratada é dar um processo a oportunidade de responder a exceções que ocorrem fora qualquer __try / __except bloco. Filtros de exceção sem tratamento são todo o processo; se qualquer thread faz com que uma exceção, mas não a processa, o filtro de exceção não tratada será chamado. Quando chamado, a função de filtro pode corrigir a causa da exceção e continuar a execução ou ele pode passar o erro para o manipulador de exceção não tratada padrão, que finaliza o processo.

Aplicativos Win32 podem instalar um filtro de exceção não tratada todo o processo com a função de API SetUnhandledExceptionFilter(). O código de inicialização da biblioteca de Microsoft Visual C++ C Runtime (CRT) implementa um __try / __except bloco ao redor a função main(). Quando uma exceção é detectada por este bloco, sua função de filtro de exceção, chamada _XcptFilter, é chamada. _XcptFilter faz duas coisas: ele mapeia as exceções Win32 para sinais usados pela função signal() CRT e despacha sinais para seus manipuladores de eventos apropriados. Se manipulador de um sinal de é definida como SIG_DFL (assim como acontece por padrão), _XcptFilter chama a API UnhandledExceptionFilter().

A API UnhandledExceptionFilter() determina se o processo está sendo depurado. Se for, em seguida, UnhandledExceptionFilter passa a exceção primeiro para o depurador e, em seguida, deve chamar filtro de exceção sem tratamento do processo.

Se o processo não estiver sendo depurado, UnhandledExceptionFilter chama filtro de exceção sem tratamento do processo. Dependendo da função de filtro retorno UnhandledExceptionFilter ou continua a execução no momento da exceção, ou exibe uma caixa de diálogo modal sistema informando ao usuário que o aplicativo deve ser encerrada devido a uma exceção não tratada.

Etapas para reproduzir o problema

Compilar o código de exemplo a seguir 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:
  • Interface de Programação de Aplicativos do Microsoft Win32 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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/ )