Como: Depurar aplicativos do serviço WindowsHow to: Debug Windows Service Applications

Um serviço deve ser executado de dentro do contexto do Gerenciador de Controle de Serviços, em vez de dentro do Visual Studio.A service must be run from within the context of the Services Control Manager rather than from within Visual Studio. Por esse motivo, depurar um serviço não é tão simples como depurar outros tipos de aplicativos do Visual Studio.For this reason, debugging a service is not as straightforward as debugging other Visual Studio application types. Para depurar um serviço, você deve iniciar o serviço e, em seguida, anexar um depurador ao processo no qual ele está sendo executado.To debug a service, you must start the service and then attach a debugger to the process in which it is running. Em seguida, você pode depurar seu aplicativo usando todas as funcionalidades de depuração padrão do Visual Studio.You can then debug your application by using all of the standard debugging functionality of Visual Studio.

Cuidado

Você não deve anexá-lo a um processo, a menos que você saiba qual é o processo e entenda as consequências da anexação, possivelmente eliminando esse processo.You should not attach to a process unless you know what the process is and understand the consequences of attaching to and possibly killing that process. Por exemplo, se você anexá-lo ao processo WinLogon e interromper a depuração, o sistema será interrompido porque ele não pode operar sem o WinLogon.For example, if you attach to the WinLogon process and then stop debugging, the system will halt because it can’t operate without WinLogon.

Você pode anexar o depurador somente a um serviço em execução.You can attach the debugger only to a running service. O processo de anexação interrompe o funcionamento atual do seu serviço. Na verdade, ele não para ou pausa o processamento do serviço.The attachment process interrupts the current functioning of your service; it doesn’t actually stop or pause the service's processing. Ou seja, se o serviço está sendo executado quando você inicia a depuração, ele ainda está tecnicamente num estado inicial conforme você depura, mas seu processamento foi suspenso.That is, if your service is running when you begin debugging, it is still technically in the Started state as you debug it, but its processing has been suspended.

Depois de anexá-lo ao processo, você pode definir pontos de interrupção e usá-los para depurar seu código.After attaching to the process, you can set breakpoints and use these to debug your code. Depois que sair da caixa de diálogo usada para anexá-lo ao processo, você estará efetivamente em modo de depuração.Once you exit the dialog box you use to attach to the process, you are effectively in debug mode. Você pode usar o Gerenciador de Controle de Serviços para iniciar, parar, pausar e continuar seu serviço, alcançando, assim, os pontos de interrupção que você definiu.You can use the Services Control Manager to start, stop, pause and continue your service, thus hitting the breakpoints you've set. Posteriormente, você pode remover esse serviço fictício depois de depuração ser concluída com êxito.You can later remove this dummy service after debugging is successful.

Este artigo aborda a depuração de um serviço que está em execução no computador local, mas você também pode depurar serviços Windows que executados em um computador remoto.This article covers debugging a service that's running on the local computer, but you can also debug Windows Services that are running on a remote computer. Confira Depuração remota.See Remote Debugging.

Observação

Depurar o método OnStart 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.Debugging the OnStart method can be difficult because the Services Control Manager imposes a 30-second limit on all attempts to start a service. Para obter mais informações, confira Solução de problemas: Depurando serviços Windows.For more information, see Troubleshooting: Debugging Windows Services.

Aviso

Para obter informações significativas para depuração, o depurador do Visual Studio deve localizar os arquivos de símbolo para os binários que estão sendo depurados.To get meaningful information for debugging, the Visual Studio debugger needs to find symbol files for the binaries that are being debugged. Se você estiver depurando um serviço que você criou no Visual Studio, os arquivos de símbolo (arquivos .pdb) estarão na mesma pasta que o executável ou biblioteca, e o depurador os carregará automaticamente.If you are debugging a service that you built in Visual Studio, the symbol files (.pdb files) are in the same folder as the executable or library, and the debugger loads them automatically. Se você estiver depurando um serviço que não criou, deve primeiro localizar símbolos para o serviço e certificar-se de que eles podem ser encontrados pelo depurador.If you are debugging a service that you didn't build, you should first find symbols for the service and make sure they can be found by the debugger. Confira Especificar arquivos de símbolo (.pdb) e de origem no Depurador do Visual Studio.See Specify Symbol (.pdb) and Source Files in the Visual Studio Debugger. Se você estiver depurando um processo do sistema ou se desejar ter símbolos para chamadas do sistema em seus serviços, você deve adicionar os Servidores de Símbolo Microsoft.If you're debugging a system process or want to have symbols for system calls in your services, you should add the Microsoft Symbol Servers. Confira Depurando símbolos.See Debugging Symbols.

Para depurar um serviçoTo debug a service

  1. Crie seu serviço na configuração de depuração.Build your service in the Debug configuration.

  2. Instalar o serviço.Install your service. Para obter mais informações, confira Como: Instalar e desinstalar serviços.For more information, see How to: Install and Uninstall Services.

  3. Inicie o serviço, usando o Gerenciador de Controle de Serviços, o Gerenciador de Servidores ou o código.Start your service, either from Services Control Manager, Server Explorer, or from code. Para obter mais informações, confira Como: Iniciar serviços.For more information, see How to: Start Services.

  4. Inicie o Visual Studio com credenciais administrativas para que você possa se conectar aos processos do sistema.Start Visual Studio with administrative credentials so you can attach to system processes.

  5. (Opcional) Na barra de menus do Visual Studio, escolha Ferramentas, Opções.(Optional) On the Visual Studio menu bar, choose Tools, Options. 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, em seguida, clique no botão OK.In the Options dialog box, choose Debugging, Symbols, select the Microsoft Symbol Servers check box, and then choose the OK button.

  6. Na barra de menus, escolha Anexar ao Processo no menu Depurar ou Ferramentas.On the menu bar, choose Attach to Process from the Debug or Tools menu. (Teclado: Ctrl+Alt+P)(Keyboard: Ctrl+Alt+P)

    A caixa de diálogo Processos é exibida.The Processes dialog box appears.

  7. Marque a caixa de seleção Mostrar processos de todos os usuários.Select the Show processes from all users check box.

  8. Na seção Processos Disponíveis, escolha o processo para o serviço e, em seguida, escolha Anexar.In the Available Processes section, choose the process for your service, and then choose Attach.

    Dica

    O processo terá o mesmo nome que o arquivo executável do serviço.The process will have the same name as the executable file for your service.

    A caixa de diálogo Anexar ao Processo é exibida.The Attach to Process dialog box appears.

  9. Escolha as opções apropriadas e, em seguida, clique em OK para fechar a caixa de diálogo.Choose the appropriate options, and then choose OK to close the dialog box.

    Observação

    Agora você está no modo de depuração.You are now in debug mode.

  10. Defina os pontos de interrupção que você deseja usar em seu código.Set any breakpoints you want to use in your code.

  11. Acesse o Gerenciador de Controle de Serviços e manuseie seu serviço, enviando comando de parar, pausar e continuar para atingir seus pontos de interrupção.Access the Services Control Manager and manipulate your service, sending stop, pause, and continue commands to hit your breakpoints. Para obter mais informações sobre como executar o Gerenciador de Controle de Serviço, confira Como: Iniciar serviços.For more information about running the Services Control Manager, see How to: Start Services. Confira também Solução de problemas: Depurando serviços Windows.Also, see Troubleshooting: Debugging Windows Services.

Dicas de depuração para serviços WindowsDebugging Tips for Windows Services

Anexar ao processo do serviço permite depurar a maior parte, mas não todo, do código para esse serviço.Attaching to the service's process allows you to debug most, but not all, the code for that service. Por exemplo, como o serviço já foi iniciado, você não pode depurar o código no serviço do método OnStart ou o código no método Main que é usado para carregar o serviço dessa maneira.For example, because the service has already been started, you cannot debug the code in the service's OnStart method or the code in the Main method that is used to load the service this way. Uma maneira de contornar essa limitação é criar um segundo serviço temporário no seu aplicativo de serviço que existe somente para ajudar na depuração.One way to work around this limitation is to create a temporary second service in your service application that exists only to aid in debugging. Você pode instalar os dois serviços e, em seguida, iniciar o serviço fictício para carregar o processo do serviço.You can install both services, and then start this dummy service to load the service process. Depois que o serviço temporário começar o processo, você poderá usar o menu Depurar do Visual Studio para anexar ao processo do serviço.Once the temporary service has started the process, you can use the Debug menu in Visual Studio to attach to the service process.

Tente adicionar chamadas para o método Sleep para atrasar a ação até que você possa anexar o processo.Try adding calls to the Sleep method to delay action until you’re able to attach to the process.

Tente alterar o programa para um aplicativo de console regular.Try changing the program to a regular console application. Para fazer isso, reescreva o método Main da seguinte maneira para que ele possa ser executado como um serviço Windows e como um aplicativo de console, dependendo de como for iniciado.To do this, rewrite the Main method as follows so it can run both as a Windows Service and as a console application, depending on how it's started.

Como: Executar um serviço Windows como um aplicativo de consoleHow to: Run a Windows Service as a console application

  1. Adicione um método para o serviço que executa os métodos OnStart e OnStop:Add a method to your service that runs the OnStart and OnStop methods:

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

    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 para Aplicativo de Console.In the Application tab of the project's properties, set the Output type to Console Application.

  4. Escolha Iniciar Depuração (F5).Choose Start Debugging (F5).

  5. Para executar novamente o programa como um serviço Windows, instale-o e inicie-o como de costume para um serviço Windows.To run the program as a Windows Service again, install it and start it as usual for a Windows Service. Não é necessário reverter essas alterações.It's not necessary to reverse these changes.

Em alguns casos, como quando você deseja depurar um problema ocorre apenas na inicialização do sistema, é necessário usar o depurador do Windows.In some cases, such as when you want to debug an issue that occurs only on system startup, you have to use the Windows debugger. Baixe o Windows Driver Kit (WDK) e consulte Como depurar serviços Windows.Download the Windows Driver Kit (WDK) and see How to debug Windows Services.

Consulte tambémSee also