virtualword
Te invitamos a registrarte para poder acceder a todo el contenido gratuito que esta comunidad provee.

Saludos Wink

Modula 2 - Uso del archivo errinfo.$$$

Ir abajo

Modula 2 - Uso del archivo errinfo.$$$

Mensaje  Kyshuo Ayame el Mar Ene 14, 2014 8:19 am

Cuando nuestros programas escritos en Modula 2 caen en tiempo de ejecución veremos un mensaje de error indicando el tipo de problema que sucedió seguido de un aviso que indica File errinfo.$$$ created. Esto significa que, en el directorio (carpeta) donde está nuestro ejecutable, se ha creado un archivo de nombre errinfo.$$$. Este archivo contiene información específica sobre el error ocurrido y específicamente en qué momento ocurrió.

En la imagen que sigue vemos un ejemplo donde un programa (en concreto NominaEmpleados) cae:
en tiempo de ejecución:



En ese ejemplo el error dice #RTS: unhandled exception #0: first argument of DEALLOCATE is NIL, lo cual significa que se intentó hacer DISPOSE de un puntero NIL. También se nos avisa de la creación del archivo errinfo. Para acceder al contenido de dicho archivo debemos usar el comando HIS, el cual es un programa que se instala junto al XDS. Lo que tenemos que hacer es ejecutar dicho comando estando en el directorio donde está errinfo, de lo contrario veremos el mensaje

Código:
XDS History formatter, Version 2.0
(c) 1996-2001 Excelsior

Can not read file 'errinfo.$$$'

Básicamente se nos indica que no se encuentra un archivo errinfo qué leer. Cuando invocamos a HIS en un directorio donde sí hay un archivo errinfo.$$$ veremos una tabla con su información; para nuestro ejemplo será esta:



Cómo verán es muy simple. Debe ser leída desde abajo hacia arriba. Las columnas indican la siguiente información:

  • Surce file: El módulo en que ocurrió el error.
  • Line: La línea de código en que ocurrió el error en el módulo indicado en la columna anterior.
  • Offset: Dirección de memoria a la que se apuntaba en ese momento. No nos interesa.
  • Procedure: Operación en la que ocurrió el error.
  • Component: Programa en el que ocurrió el error. En nuestros casos siempre será el mismo en todas las filas, pero cuando un programa realiza invocaciones a otros programas se muestra allí.


La tabla nos muestra el historial de invocaciones en el órden inverso al que fueron realizadas, por eso debemos leerla desde abajo hacia arriba:

  • La última fila indica que la ejecución fue interrumpida en la línea 248 del módulo NominaEmpleados en el bloque principal (main).
  • La fila de arriba indica que la operación que había sido invocada desde el main era RemoverEmpleadoSistema del módulo Controlador, es decir que en la línea 248 del main hay una invocación a dicha operación. Estando en RemoverEmpleadoSistema el error ocurrió en la línea 395.
  • La siguiente fila indica que se invocó a EliminarEmpleado del módulo Empleado, o sea que en la línea 395 de Controlador se realiza una invocación a EliminarEmpleado. La ejecución dentro de esta operación llegó a la línea 104 de Empleado.mod.
  • Luego se nos indica que la ejecución estaba en la operación EliminarCargo (o sea que en la línea 104 de Empleado se invocó a EliminarCargo) del módulo Cargo llegando a la línea 204.
  • Finalmente tenemos que la ejecución quedó en la línea 230 del módulo Hora en la operación EliminarHora, es decir que en la línea 204 de Cargo se invocó a EliminarHora.
  • Las primeras dos filas indican que luego la ejecución pasó a Storage y luego a EXCEPTIONS, cuestión que no nos importa ya que esos módulos no tienen errores, son librerías ISO.


Teniendo entonces presente cuál era la entrada del sistema y este historial de ejecuciones podemos seguir paso a paso lo que sucedió y así rastrear el error. En este caso nos lleva a que ocurrió efectivamente en el módulo Hora, pero esto no significa que el error sea de dicho módulo. Sabemos que el error fue intentar hacer DISPOSE de un puntero NIL en la operación EliminarHora, sin embargo hay que ver si este error se debe a la propia operación o bien si es que se ha pasado a esta desde arriba (módulos que la invocan) un puntero que realmente no debía ser pasado. Por eso es importante hacer todo el seguimiento del historial.

Muchas veces pasará que hagan todo el seguimiento y no encuentren ningún error, es decir, que cada código de cada módulo esté correcto y sin embargo el sistema caerá. En estos casos resulta que hay algún error sutil por ahí que resultan en la falla de ciertas porciones de código aparentando que el problema es en dichas porciones pero en realidad se arrastra algo de antes.

El comando HIS facilita las cosas pero no nos soluciona la vida.
avatar
Kyshuo Ayame
Admin

Mensajes : 105
Fecha de inscripción : 14/11/2012
Edad : 29

Ver perfil de usuario http://virtualworld.forouruguay.net

Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.