2009-04-17 21 views
5

Tengo un servicio de Windows con un temporizador. Es muy difícil depurarlo. Porque comienzo el servicio y pongo puntos de corte en diferentes partes del código. Cuando adjunte el proceso, espero que el servicio comience desde el principio en lugar de un lugar randome en el código del medio donde tengo puntos de ruptura. Es difícil depurarlo como una aplicación normal donde conoces el punto de partida. Parece que hay procesos en el fondo que aún no se han completado. Así que cada vez, empiezo a depurar, en lugar de comenzar desde el primer punto de ruptura, comienza desde un punto de ruptura aleatorio en el medio de la aplicación.¿Cómo depurar un servicio de Windows utilizando puntos de interrupción?

Quiero saber cómo funciona el servicio de Windows en términos de procesos, hilos, etc. ... y cómo puedo comenzar a depurar desde el principio?

+0

Mi verdadero desafío es evitar que el servicio salte? ¿Hay hilos que no sé? –

Respuesta

0

más simple enfoque ...

poner el negocio - porciones funcionales del código de servicio en una clase separada, en un montaje de biblioteca independiente ... A continuación, puede depurarlo forma independiente utilizando una aplicación de consola sencilla ...

+0

esta es una aplicación de producción y no puedo cambiar el código fuente en este momento. –

9

Supongo que estás hablando de .Net por supuesto. Siempre utilicé el siguiente código para depurar mis servicios. Lo coloco donde quiero que se lance el depurador. Inicie el servicio e inicia Visual Studio automáticamente. Funciona bien para mi

System.Diagnostics.Debugger.Launch();

System.Diagnostics.Debugger.Debug();

+0

Gracias por los comentarios. Sí, estoy hablando de .net y voy a googlear su conjunto de instrucciones para ver cómo funcionaría. –

+0

Puede usar este código para la depuración. Pero no olvides eliminarlo más tarde cuando hayas terminado. Por supuesto, necesitaría recompilar el servicio después de hacer cualquier cambio. –

+0

Siempre uso System.Diagnostics.Debugger.Debug() ;, puse una clave booleana en el archivo de configuración "IsDebugging". Así que enciendo o apaga el depurador en cualquier momento – Costa

2

Simplemente presione F5. Puede ejecutar servicios de Windows con regularidad al igual que las aplicaciones.

Dado que no tenemos otros argumentos de línea de comandos que sólo tiene que utilizar el presense de ningún argumento de línea de comandos como una señal para funcionar como una aplicación normal de Windows. También podría requerir la presencia de un argumento de línea de comando específico (es decir,/depuración).

If sArgs IsNot Nothing AndAlso sArgs.Length > 0 Then 
    ' If there are command-line args then run in non-service mode 
    Dim svc As ServiceMain = New ServiceMain(True) 
    svc.OnStart(Nothing) 
    System.Windows.Forms.Application.Run() 
    svc.OnStop() 
Else 
    ' If no command-line args then run normally 
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase 
    ServicesToRun = New System.ServiceProcess.ServiceBase() {New ServiceMain(False)} 
    System.ServiceProcess.ServiceBase.Run(ServicesToRun) 
End If 
0

No es tan conveniente como los puntos de interrupción en el depurador, pero me pareció útil escribir resultados en un simple archivo de registro. Tenemos servicios que generan hilos para realizar trabajos y escribir en un archivo de registro ha ayudado a identificar problemas.

1

Puede usar "Image File Execution Options" y configurar que cada vez que se inicie el servicio se inicie dentro de un depurador.
Ese depurador puede ser WinDBG o Visual Studio.

Cuestiones relacionadas