2012-08-12 28 views
8

En un proyecto Delphi 7 instalamos FastMM. Poco después notamos que uno de los formularios comenzaba a emitir el mensaje Resumen de error al cerrar. Lo he depurado extensamente y no puedo encontrar el motivo hasta ahora. El motivo habitual de este mensaje de error no parece aplicarse aquí. La aplicación no define clases abstractas. También busqué en el formulario un posible uso de TStrings o algo así. Lo que es más importante, no hicimos (bueno, creemos que no) cambios en este formulario. Simplemente se rompió.Posibles causas oscuras para Error abstracto en Delphi?

  1. ¿Hay alguna otra causa posible para este error además de tratar de llamar al método no implementado?
  2. ¿Hay alguna posibilidad de que FastMM haya habilitado algún error oscuro en la aplicación, que permaneció oculto hasta ahora?

Si la respuesta a estas preguntas es no, entonces continuaré buscando una llamada a un método no implementado, aliviada de que no me falta algo más.

+1

Experimenté "Error abstracto" cuando se creó un formulario, generalmente sucede cuando crea un formulario (Form1), agrega componentes, etc. y luego crea otro formulario (Form2) que hereda Form1, guarda todo, todo bien hasta ahora, ahora, si modifica Form1 (agrega componente, modifica la propiedad del componente ...) guarda y reconstruye, cuando se crea form2 -> bam, error abstracto, desde entonces, siempre he evitado la herencia de formularios en el diseño. – ComputerSaysNo

Respuesta

11

Si hay daños en la memoria, se pueden producir todo tipo de errores y es muy difícil encontrar la causa.

Para responder a sus preguntas: 1) Sí, el error abstracto también puede deberse a daños en la memoria, y 2) Sí, habilitar FastMM puede hacer visibles errores que normalmente pasan desapercibidos (pero aún así deben corregirse).

Algunos consejos generales para la búsqueda de errores de memoria:

  1. Try "FullDebugMode" puesta en FastMM.
  2. Asegúrate de que todo lo que crees tenga un juego gratuito.
  3. Asegúrese de que no se libere nada más de una vez.
  4. Asegúrate de que un objeto no se use después de que se haya liberado (o antes de que se haya creado).
  5. Active las sugerencias y advertencias (y corrígelas cuando se presenten).
+3

+1. Yo agregaría '5. Active los consejos y advertencias (y corríjalos cuando ocurran) ' –

+0

@KenWhite: Absolutamente. Y haría que '1. Active las sugerencias y advertencias ... ', énfasis en' 1.' :-) –

+2

@KenWhite Agregado :-) El único problema es que en el código heredado podrían existir cientos de advertencias y corregirlas (incorrectamente) puede presentar nuevos errores. Por lo tanto, debe hacerse con cuidado. –

3

"Simplemente se rompió" - probablemente siempre estuvo roto pero ahora lo sabes.

He visto problemas al cerrar un formulario como parte de un evento de botón. El formulario se destruye y el resto de los mensajes del botón se envían a un botón que ya no existe. El método Release evita esto al (desde la memoria) publicar un mensaje wm_close de nuevo en el formulario

+0

Tu respuesta me ayudó. Tenía un botón que se borraba a sí mismo y agregaba nuevos botones. El truco era configurar un semáforo para volver a cargar después de salir del código del botón. – CharlesW

2

respuesta a la pregunta 1:

Sí. Esto es lo que causó en mi caso un error Resumen:

TWinControl(Sender).Visible:= FALSE;   

Esto funcionó cuando el remitente era un TButton pero elevó el error (por supuesto) cuando el remitente era un taction.

Respuesta a la pregunta 2: Sí. He visto que eso también sucede.Deberíamos dejar muy claro que esto no significa que FastMM tenga errores. El error fue 'inactivo'. FastMM solo lo activó.
En realidad, debe confiar en FastMM aún más para encontrar su problema. Cambie FastMM al modo de depuración completa para esto. Se le ayudará con:

Make sure an object is not used after it has been freed (or before it has been created)

Además, en algunos casos, todo el proyecto se arrugó y me dio el error abstracta. Nada funcionó hasta que eliminé el archivo DPROJ. Simplemente haga una comparación entre su archivo DPROJ actual y el que está en su espalda y verá cómo el IDE f **** sube el archivo.

Cuestiones relacionadas