En los últimos meses he recibido algunos informes de QA sobre la suspensión de uno de nuestros servicios. Al examinar un vuelco colgante usando WinDbg, cada vez que descubrí lo mismo: la sección crítica de bloqueo del cargador está bloqueada pero el hilo propietario no se encuentra por ningún lado. Como el hilo se ha ido y el único rastro que puedo ver es una sección crítica global que dejó atrás, no veo qué código se ejecutó en el subproceso de subproceso, ni siquiera de qué DLL salió ese subproceso, ni siquiera puede ser uno de nuestro (es decir, proveedor de terceros).Buscando ideas para eliminar errores en un gremlin de inicio de servicio de windows complicado
Este problema es muy esporádico, solo se lo ve tal vez 3-4 veces en los últimos 6 meses que ocurren naturalmente en la naturaleza. El resto del tiempo, el servicio funciona perfectamente. Así que esto me hace creer que es una especie de condición de tiempo/carrera.
Recientemente, he decidido encargarme de resolver esto. Configuro una máquina con script WinTask que constantemente inicia/detiene dicho servicio. Una buena noticia es que dentro de 5-6 horas puedo reproducir el problema.
Ahora para la siguiente parte: ¿cómo lo aíslo?
Esto es lo que he probado hasta ahora:
campo utilizado "depurador" en la configuración de la imagen gflags para ejecutar el servicio bajo automagicamente cdb cada vez que se inicia. Hasta ahora, esto ha estado funcionando durante dos días y nunca se colgó, por lo que estoy pensando en que el depurador introdujo lo suficiente de un cambio de tiempo para que el problema sea invisible.
Verificador de aplicación descargado y configurado el proceso para ejecutar con eso. Se ha encontrado un error completamente no relacionado donde creamos la variable temporal CComBSTR, la asignamos a un VARIANT y pasamos la variante a una llamada de función aunque CComBSTR eliminó por mucho tiempo la cadena asignada en ese punto. No crea que este error esté relacionado porque la cadena es de solo lectura y el hilo en el que se ejecuta no es el que está muriendo.
Estoy haciendo esta publicación en caso de que se les ocurra algo que no estoy considerando.
Pensé que había una utilidad de Windows que cargaba artificialmente la CPU e hizo otras cosas para hacer aparecer las condiciones de carrera y pensé que el verificador de aplicaciones hizo eso, pero aparentemente no es así. ¿Alguien sabe por lo que estoy hablando, o simplemente lo soñé?
A menos que algo sucede durante el fin de semana mi próximo paso sería desactivar todos los depuradores, volver a la acción y cortar uno de DllMains para registrar eventos/THREAD_DETACH THREAD_ATTACH. Al menos podré interceptar el hilo que está muriendo cuando se crea. Eso podría arrojar algo de luz.
-1 ?? ¿¿por qué?? ¿No mostré suficiente detalle? ¿Parece que no hice suficiente investigación? ¿Las personas no preguntan a stackoverflow cuando se quedan perplejos ante los problemas de desarrollo de software? – DXM
Sí, esta es una pregunta perfectamente válida. Lo único que lo haría mejor sería publicar algún código. Supongo que esa es la razón por la que alguien pasó volando. –
Es una aplicación de producción que ha estado en el mercado por más de 10 años. Ni siquiera sé qué DLL está causando el problema, y mucho menos publicar código de empresa de código cerrado en línea, incluso si pudiera copiar/pegar 5 millones de líneas de código fuente. No tengo idea de qué fue lo que cambió, pero la primera vez que vi el problema fue hace 6 meses. – DXM