Por lo tanto, después de algunos cambios recientes descubrimos que una de nuestras aplicaciones más antiguas a veces falla al apagar. Esto se manifiesta en forma de mensajes de "Error de tiempo de ejecución 216" o en un mensaje de Informe de errores de Windows que indica que la aplicación ha dejado de funcionar. La aplicación ya está emitiendo OutputDebugString
-mensajes en todo momento y AFAICT todo nuestro código se ejecuta correctamente hasta su finalización. Se invocan todos los destructores, como todas las secciones de finalización y los destructores de clase, ninguno de los cuales genera excepciones.¿Cómo depurar un bloqueo que solo ocurre al apagar la aplicación? (Delphi)
Además, ni el modo de depuración completa madExcept ni FastMM4 parecen tener algo de lo que quejarse (aunque podría ser una conclusión falsa porque el bloqueo puede ocurrir incluso antes de que se ejecute el código de finalización de esos componentes).
Entonces, ¿qué harías? ¿Dónde comenzarías?
Esta pregunta se supone que es más sobre el enfoque general para esta clase de problemas que sobre el caso específico actualmente estoy haciendo frente así que estoy deliberadamente dejando de lado los detalles. No dude en preguntar si cree que podrían ser relevantes para la elección del enfoque de depuración y los agregaré más adelante.
Hay un error de VCL que se manifiesta como AV en el cierre. Está relacionado con la destrucción de formularios por parte del "Propietario". Lo soluciono cerrando formularios explícitamente en el archivo .dpr después de 'Application.Run'. Si deja que 'Application' haga el cierre por usted, puede haber problemas con las referencias obsoletas. –
@David: Eso suena interesante. ¿Tienes un número de control de calidad para eso? Sin embargo, a excepción del formulario principal, estoy creando todos los formularios en el código con el formulario principal respectivo como el propietario. ¿El problema del que está hablando se aplica también en ese caso? –
si confía en la destrucción de la Aplicación para reducir todo lo demás, entonces podría aplicarse el error del que estoy hablando. Intenta poner un 'MainForm.Free' en tu archivo .dpr. Miraré el número de control de calidad. –