Depurar usando o Depurador Just-In-Time no Visual Studio

A depuração Just-In-Time pode iniciar o Visual Studio automaticamente quando um aplicativo em execução fora do Visual Studio falha ou trava. Com a depuração Just-In-Time, você pode testar aplicativos fora do Visual Studio e abrir o Visual Studio para iniciar a depuração quando um problema ocorrer.

A depuração Just-In-Time funciona para aplicativos da área de trabalho do Windows. Ele não funciona com aplicativos universais do Windows ou com o código gerenciado hospedado em um aplicativo nativo, como Visualizadores.

Dica

Se você quiser apenas impedir que a caixa de diálogo do Depurador Just-In-Time apareça, mas não tiver o Visual Studio instalado, consulte Desabilitar o Depurador Just-In-Time. Se você tinha o Visual Studio instalado, talvez precise desabilitar a depuração Just-In-Time do Registro do Windows.

Habilitar ou desabilitar a depuração Just-In-Time no Visual Studio

Você pode configurar a depuração Just-In-Time na caixa de diálogo Ferramentas>Opções (ou Depurar>Opções) do Visual Studio.

Observação

Para habilitar ou desabilitar a depuração Just-In-Time, você precisa estar executando o Visual Studio como administrador. Habilitar ou desabilitar a depuração Just-In-Time define uma chave do Registro, e privilégios de Administrador podem ser necessários para alterar essa chave. Para abrir o Visual Studio como administrador, clique com o botão direito do mouse no aplicativo Visual Studio e escolha Executar como administrador.

Para habilitar ou desabilitar a depuração Just-In-Time:

  1. No menu Ferramentas ou Depurar, selecione Opções>Depuração>Just-In-Time.

    Habilitar ou desabilitar a depuração JIT

    Observação

    Se a opção de menu Just-In-Time não for exibida, verifique se o depurador Just-In-Time está instalado usando o Instalador do Visual Studio.

  2. Na caixa Habilitar a depuração Just-In-Time para esses tipos de código, selecione os tipos de código que deseja que a depuração Just-In-Time depure: Gerenciado, Nativo e/ou Script.

  3. Selecione OK.

Se você habilitar o depurador Just-In-Time, mas ele não abrir quando um aplicativo falhar ou travar, consulte Solucionar problemas da depuração Just-In-Time.

Desabilitar a depuração Just-In-Time do Registro do Windows

A depuração Just-In-Time ainda pode estar habilitada mesmo que o Visual Studio não esteja mais instalado no seu computador. Se o Visual Studio não estiver mais instalado, você poderá desabilitar a depuração Just-In-Time editando o Registro do Windows.

Para desabilitar a depuração Just-In-Time editando o Registro:

  1. No menu Iniciar do Windows, execute o Editor do Registro (regedit.exe).

  2. Na janela Editor do Registro, localize e exclua as seguintes entradas do Registro se elas existirem:

    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\DbgManagedDebugger

    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

    Chave do Registro JIT

  3. Exclua também as seguintes entradas do Registro se elas existirem:

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

    Tenha cuidado para não excluir nem alterar acidentalmente outras chaves do Registro.

  4. Feche a janela Editor do Registro.

Habilitar a depuração Just-In-Time de um formulário do Windows

Por padrão, aplicativos Windows Forms têm um manipulador de exceção de nível superior que permite que o aplicativo continue em execução se ele puder se recuperar. Se um aplicativo Windows Forms gerar uma exceção sem tratamento, ele mostrará a seguinte caixa de diálogo:

Exceção sem tratamento do Windows Form

Para habilitar a depuração Just-In-Time em vez do tratamento de erros padrão do Windows Forms, adicione estas configurações:

  • Na seção system.windows.forms do arquivo machine.config ou <nome do aplicativo>.exe.config, defina o valor de jitDebugging como true:

    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>
    
  • No aplicativo C++ do Windows Forms, defina DebuggableAttribute como true em um arquivo .config ou no seu código. Se você compilar com /Zi e sem /Og, o compilador definirá esse atributo para você. Entretanto, se você desejar depurar uma versão não otimizada, deverá definir DebuggableAttribute adicionando a seguinte linha no arquivo AssemblyInfo.cpp do seu aplicativo:

    [assembly:System::Diagnostics::DebuggableAttribute(true, true)];
    

    Para obter mais informações, consulte DebuggableAttribute.

Usar a depuração Just-In-Time

Este exemplo descreve a depuração Just-In-Time quando um aplicativo gera um erro.

  • Você precisa ter o Visual Studio instalado para seguir estas etapas. Se você não tem o Visual Studio, pode baixar a Edição Visual Studio Community gratuitamente.

  • Verifique se a depuração Just-In-Time está habilitada em Ferramentas>Opções>Depuração>Just-In-Time.

Neste exemplo, você deve fazer um aplicativo de console C# no Visual Studio que gere uma NullReferenceException.

  1. No Visual Studio, crie um aplicativo de console C# (Arquivo>Novo>Projeto>Visual C#>Aplicativo de Console) chamado ThrowsNullException. Para obter mais informações sobre como criar projetos no Visual Studio, consulte instruções passo a passo: criar um aplicativo simples.

  2. Quando o projeto for aberto no Visual Studio, abra o arquivo Program.cs. Substitua o método Main() pelo código a seguir, que imprime uma linha no console e, em seguida, gera uma NullReferenceException:

    static void Main(string[] args)
    {
        Console.WriteLine("we will now throw a NullReferenceException");
        throw new NullReferenceException("this is the exception thrown by the console app");
    }
    
  3. Para compilar a solução, escolha a configuração Depuração (padrão) ou Versão e, em seguida, selecione Compilar>Recompilar Solução.

    Observação

    • Escolha a configuração de Depuração para a experiência completa de depuração.
    • Se você selecionar a configuração de Versão, precisará desativar Apenas Meu Código para que este procedimento funcione. Em Ferramentas>Opções>Depuração, desmarque Habilitar Apenas Meu Código.

    Para saber mais sobre configurações de build, veja Noções básicas sobre configurações de build.

  4. Abra o aplicativo compilado ThrowsNullException.exe na pasta do projeto C# (...\ThrowsNullException\ThrowsNullException\bin\Debug ou ...\ThrowsNullException\ThrowsNullException\bin\Release).

    Você verá a seguinte janela de comando:

    Captura de tela do console para ThrowsNullException.exe, que gera uma exceção de referência nula sem tratamento (System.NullReferenceException).

  5. A caixa de diálogo Escolher Depurador Just-In-Time é aberta.

    Captura de tela da caixa de diálogo Escolher Depurador Just-In-Time, que aparece após a exceção aparecer na janela do console ThrowsNullException.exe.

    Em Depuradores Disponíveis, selecione Nova instância de< sua versão/edição preferida do Visual Studio>, se ainda não estiver selecionada.

  6. Selecione OK.

    O projeto ThrowsNullException é aberto em uma nova instância do Visual Studio, com a execução interrompida na linha que gerou a exceção:

    Captura de tela do projeto ThrowsNullException no Visual Studio, realçando a linha do código-fonte que gerou a exceção.

Você pode iniciar a depuração neste ponto. Se você estiver depurando um aplicativo real, precisará encontrar o motivo pelo qual o código está gerando a exceção.

Cuidado

Se o aplicativo contiver código não confiável, uma caixa de diálogo de aviso de segurança será exibida, permitindo que você decida se deseja continuar com a depuração. Antes de prosseguir com a depuração, decida se você confia no código. Você mesmo escreveu o código? Se o aplicativo está sendo executado em um computador remoto, você reconhece o nome do processo? Se o aplicativo estiver em execução localmente, considere a possibilidade de haver código mal-intencionado em execução no computador. você decidir que o código é confiável, selecione OK. Caso contrário, selecione Cancelar.

Solucionar problemas de depuração Just-In-Time

Se a depuração Just-In-Time não for iniciada quando um aplicativo falhar, mesmo que esteja habilitado no Visual Studio:

  • Um problema conhecido do Windows pode estar fazendo com que o depurador Just-In-Time falhe.

    A correção é adicionar um Valor DWORD de Automático, com Dados do valor de 1, às seguintes chaves do Registro:

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

    • (Para aplicativos de 32 bits em máquinas de 64 bits) HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug

  • O Relatório de Erros do Windows pode estar assumindo o tratamento de erros em seu computador.

    Para corrigir esse problema, use o Editor do Registro para adicionar um Valor DWORD de Desabilitado, com Dados do valor de 1, às seguintes chaves do Registro:

    • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting

    • (Para aplicativos de 32 bits em máquinas de 64 bits) HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ Microsoft \ Windows \ Relatório de erros do Windows

    Para obter mais informações, confira Configurações de .WER.

Você pode ver as seguintes mensagens de erro durante a depuração Just-In-Time:

  • Não é possível se anexar ao processo de travamento. O programa especificado não é um programa do Windows ou do MS-DOS.

    O depurador tentou anexar a um processo em execução em outro usuário.

    Para solucionar esse problema, no Visual Studio, abra Depurar>Anexar ao Processo (ou pressione Ctrl + Alt + P) e localize o processo que você deseja depurar na lista Processos Disponíveis. Se você não souber o nome do processo, encontre a ID do processo na caixa de diálogo do Depurador Just-In-Time do Visual Studio.. Selecione o processo na lista Processos Disponíveis e selecione Anexar. Selecione Não para ignorar a caixa de diálogo Depurador Just-In-Time.

  • Não foi possível iniciar o depurador porque não há usuário conectado.

    Não há nenhum usuário conectado ao console, portanto não existe nenhuma sessão de usuário para exibir a caixa de diálogo de depuração Just-In-Time.

    Para corrigir esse problema, conecte-se ao computador.

  • Classe não registrada.

    O depurador tentou criar uma classe COM que não está registrada, provavelmente devido a um problema de instalação.

    Para corrigir o problema, use o Instalador do Visual Studio para reinstalar ou reparar sua instalação do Visual Studio.