Share via


Como: Depurar aplicativos de serviço do Windows

Nota

Este artigo não se aplica a serviços hospedados no .NET. Para obter o conteúdo mais recente sobre os serviços do Windows que usam Microsoft.Extensions.Hosting.BackgroundService e o modelo Serviço de Trabalho, consulte:

Um serviço deve ser executado de dentro do contexto do Gerenciador de Controle de Serviços em vez de dentro do Visual Studio. Por esse motivo, depurar um serviço não é tão simples quanto depurar outros tipos de aplicativo do Visual Studio. Para depurar um serviço, você deve iniciá-lo e, em seguida, anexar um depurador ao processo no qual ele está sendo executado. Em seguida, você pode depurar seu aplicativo usando toda a funcionalidade de depuração padrão do Visual Studio.

Atenção

Você não deve anexar a um processo a menos que saiba qual é o processo e compreenda as consequências de anexar e possivelmente matar esse processo. Por exemplo, se você anexar ao processo WinLogon e, em seguida, parar a depuração, o sistema irá parar porque ele não pode operar sem WinLogon.

Você pode anexar o depurador somente a um serviço em execução. O processo de anexação interrompe o funcionamento atual do seu serviço; na verdade, ele não interrompe ou pausa o processamento do serviço. Ou seja, se o seu serviço estiver em execução quando você começar a depuração, ele ainda estará tecnicamente no estado Iniciado enquanto você o depura, mas seu processamento foi suspenso.

Depois de anexar ao processo, você pode definir pontos de interrupção e usá-los para depurar seu código. Depois de sair da caixa de diálogo que você usa para anexar ao processo, você está efetivamente no modo de depuração. Você pode usar o Gerenciador de Controle de Serviços para iniciar, parar, pausar e continuar seu serviço, atingindo assim os pontos de interrupção definidos. Mais tarde, você pode remover esse serviço fictício depois que a depuração for bem-sucedida.

Este artigo aborda a depuração de um serviço que está sendo executado no computador local, mas você também pode depurar os Serviços do Windows que estão sendo executados em um computador remoto. Consulte Depuração remota.

Nota

Depurar o OnStart método pode ser difícil porque o Gerenciador de Controle de Serviços impõe um limite de 30 segundos em todas as tentativas de iniciar um serviço. Para obter mais informações, consulte Solução de problemas: depurando serviços do Windows.

Aviso

Para obter informações significativas para depuração, o depurador do Visual Studio precisa localizar arquivos de símbolo para os binários que estão sendo depurados. Se você estiver depurando um serviço criado no Visual Studio, os arquivos de símbolo (arquivos .pdb) estarão na mesma pasta que o executável ou a biblioteca e o depurador os carregará automaticamente. Se você estiver depurando um serviço que não foi criado, primeiro deve encontrar símbolos para o serviço e certificar-se de que eles podem ser encontrados pelo depurador. Consulte Especificar símbolo (.pdb) e arquivos de origem no depurador do Visual Studio. Se você estiver depurando um processo do sistema ou quiser ter símbolos para chamadas do sistema em seus serviços, adicione os Servidores de Símbolos da Microsoft. Consulte Símbolos de depuração.

Para depurar um serviço

  1. Crie seu serviço na configuração Depurar.

  2. Instale o seu serviço. Para obter mais informações, consulte Como instalar e desinstalar serviços.

  3. Inicie o serviço, a partir do Gerenciador de Controle de Serviços, do Gerenciador de Servidores ou do código. Para obter mais informações, consulte Como iniciar serviços.

  4. Inicie o Visual Studio com credenciais administrativas para que você possa anexar aos processos do sistema.

  5. (Opcional) Na barra de menus do Visual Studio, escolha Ferramentas, Opções. Na caixa de diálogo Opções, escolha Depuração, Símbolos, marque a caixa de seleção Servidores de Símbolos da Microsoft e escolha o botão OK.

  6. Na barra de menus, escolha Anexar ao processo no menu Depurar ou Ferramentas . (Teclado: Ctrl+Alt+P)

    A caixa de diálogo Processos é exibida.

  7. Marque a caixa de seleção Mostrar processos de todos os usuários .

  8. Na seção Processos Disponíveis, escolha o processo para seu serviço e, em seguida, escolha Anexar.

    Gorjeta

    O processo terá o mesmo nome que o arquivo executável para o seu serviço.

    A caixa de diálogo Anexar ao processo é exibida.

  9. Escolha as opções apropriadas e, em seguida, escolha OK para fechar a caixa de diálogo.

    Nota

    Agora você está no modo de depuração.

  10. Defina os pontos de interrupção que você deseja usar em seu código.

  11. Acesse o Gerenciador de Controle de Serviços e manipule seu serviço, enviando comandos stop, pause e continue para atingir seus pontos de interrupção. Para obter mais informações sobre como executar o Gerenciador de Controle de Serviços, consulte Como iniciar serviços. Além disso, consulte Solução de problemas: depurando serviços do Windows.

Dicas de depuração para os Serviços do Windows

Anexar ao processo do serviço permite depurar a maioria, mas não todos, o código para esse serviço. Por exemplo, como o serviço já foi iniciado, você não pode depurar o código no método do OnStart serviço ou o Main código no método que é usado para carregar o serviço dessa maneira. Uma maneira de contornar essa limitação é criar um segundo serviço temporário em seu aplicativo de serviço que existe apenas para ajudar na depuração. Você pode instalar ambos os serviços e, em seguida, iniciar este serviço fictício para carregar o processo de serviço. Depois que o serviço temporário tiver iniciado o processo, você poderá usar o menu Depurar no Visual Studio para anexar ao processo de serviço.

Tente adicionar chamadas ao método para atrasar a Sleep ação até conseguir anexar ao processo.

Tente alterar o programa para um aplicativo de console regular. Para fazer isso, reescreva o Main método da seguinte maneira para que ele possa ser executado como um serviço do Windows e como um aplicativo de console, dependendo de como ele é iniciado.

Como: Executar um serviço do Windows como um aplicativo de console

  1. Adicione um método ao seu serviço que execute os OnStart métodos e OnStop :

    internal void TestStartupAndStop(string[] args)  
    {  
        this.OnStart(args);  
        Console.ReadLine();  
        this.OnStop();  
    }  
    
  2. Reescreva o Main método da seguinte maneira:

    static void Main(string[] args)  
    {  
        if (Environment.UserInteractive)  
        {  
            MyNewService service1 = new MyNewService(args);  
            service1.TestStartupAndStop(args);  
        }  
        else  
        {  
            // Put the body of your old Main method here.  
        }  
    }
    
  3. Na guia Aplicativo das propriedades do projeto, defina o tipo de saída como Aplicativo de console.

  4. Escolha Iniciar depuração (F5).

  5. Para executar o programa como um serviço do Windows novamente, instale-o e inicie-o como de costume para um serviço do Windows. Não é necessário reverter essas mudanças.

Em alguns casos, como quando você deseja depurar um problema que ocorre apenas na inicialização do sistema, você precisa usar o depurador do Windows. Baixe o Kit de Driver do Windows (WDK) e consulte Como depurar os Serviços do Windows.

Consulte também