miércoles, 2 de febrero de 2011

OFFSET y S0C7, ¿Cómo localizar el error?

Nos casca un jcl por un S0C7, ¡vaya! a ver como sé yo ahora que línea de las mil que tengo me lo ha dado!. Se acabó el proceso engorroso de buscar qué maldito move me está causando el problema. 

En algunas plataformas existen programas REXX que automáticamente te dicen la línea del programa que te ha provocado el offset. Intentaré crear uno común y lo cuelgo en el blog.

Pero para todos los demás lugares donde no existe esta utilidad, aquí os dejo como hacer para saber la línea:

  1. Provocar el offset. (Por ejemplo, mover un alfanumérico con símbolos raros a un comprimido)
  2. Encontrar el númerito del OFFSET. Desde la cola ST, entramos con ‘?’ en el jcl fallido. Entramos con ‘S’ en el apartado SYSOUT:

  3. Pondrá algo parecido a esto:

    CEE3207S The system detected a data exception (System Completion Code=0C7).    
    From compile unit NOMBRE_PGM at entry point NOMBRE_PGM at compile unit offsset +00001460 at entry offset +00001460 at address 1965BBE0.
  4.  Nos apuntamos el número del offset (1460). El + y los ceros podemos olvidarlos. No os asustéis si el número trae letras ya que se trata de un número hexadecimal.
  5. Necesitamos tener la compilación del programa que nos da el offset. Volvemos a la cola ST y entramos con una S en la compilación. Es importante que sea la misma compilación con la que hemos ejecutado o al menos que la compilación no haya cambiado con respecto a la de la ejecución.
  6. Una vez dentro buscamos la palabra “HEXLOC”. (F HEXLOC). 
  7. Aparecerá una lista parecida a esta:
    LINE Ñ
    HEXLOC VERB       LINE Ñ HEXLOC VERB
    000954 000BEC PERFORM    000958 000C04 PERFORM
    000976 000C40 PERFORM    000978 000C60 INITIALIZE
    000984 000D38 DISPLAY    000986 000D42 PERFORM
    001110 001408 PERFORM    001122 00142A INITIALIZE
    001125 001456 MOVE       001126 001468 MOVE
    001128 001478 MOVE       001129 001482 MOVE
    001144 001498 PERFORM    001146 0014B4 PERFORM
    001150 0014EA STOP       001158 00150C CLOSE
    001163 001554 INITIALIZE 001165 001606 SET
    001168 001616 MOVE       001169 001622 MOVE
    001174 001644 IF         001175 001652 INITIALIZE
  8. Nos fijamos en las columnas HEXLOC(generalmente tendremos 3, hubiera puesto la tercera pero no me cabe), y vemos que tiene unos número hexadecimales. Ahora lo que tenemos que hacer es buscar nuestro offset en estas 3 columnas. Están ordenadas de menor a mayor y de izquierda a derecha, si no lo encontramos como en el caso del ejemplo, hemos de buscar el rango donde se encuentra y quedarnos con el primero. En el ejemplo buscamos el 1460, que está entre el 1456 y el 1478. Nos quedamos siempre con el primero (1456) y miramos el valor de la columna LINE de éste. En este caso es 1125. ¡Esta es la línea del programa que nos está dando el offset!

Os dejo el enlace para descargaros el código REXX para localizar el OFFSET:
Descargar OFFSET

7 comentarios:

José Antonio Romero dijo...

Yo particularmente suelo usar la opción de compilación LIST en vez de OFFSET, con esto conseguimos ver el desensamblado del programa, no porque yo sepa mucho de ensamblador, si no porque allí se ve cada una de las líneas de código del programa y facilita algo más la compresión de donde está el problema. Suelo añadir como opciones adicionales XREF MAP, de esta forma rizamos el rizo mostrándonos donde se usan y modifican (con 'M' delante de la linea) las distintas variables del programa y otras cosillas más.

Michael Jannes dijo...

José Antonio Romero : no se entiende lo que quieres informar, cómo usar lo de la compilacion LIST, etc. en general no se comprende tu aporte

Manu dijo...

GRACIAS

Vanesa Alcazar dijo...

Genial manera de encontrar los errores de los dichosos SOC7!!!

i_ramirez dijo...

diculpar, pero este codigo, donde lo ponemos.

Tallian dijo...

Buenas i_ramirez.
Al final del artículo http://www.consultoriocobol.com/2010/12/utilidades-rexx-ii-editar-fichero-desde.html
tienes explicado como ejecutar ese código.
Saludos!

Rodrigo dijo...

Vientos ... agregar que también sirve para un ASRA en cics, por cierto que me han cambiado de cliente antes localizaba la memoria exacta ahora tengo que buscar el inferior como lo mencionan aqui supongo que es por la forma de compilar... ya lo comparare cuando me regresen a el otro cliente