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:
- Provocar el offset. (Por ejemplo, mover un alfanumérico con símbolos raros a un comprimido)
- Encontrar el númerito del OFFSET. Desde la cola ST, entramos con ‘?’ en el jcl fallido. Entramos con ‘S’ en el apartado SYSOUT:
- 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. - 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.
- 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.
- Una vez dentro buscamos la palabra “HEXLOC”. (F HEXLOC).
- Aparecerá una lista parecida a esta:
LINE Ñ HEXLOC VERB LINE Ñ HEXLOC VERB000954 000BEC PERFORM 000958 000C04 PERFORM000976 000C40 PERFORM 000978 000C60 INITIALIZE000984 000D38 DISPLAY 000986 000D42 PERFORM001110 001408 PERFORM 001122 00142A INITIALIZE001125 001456 MOVE 001126 001468 MOVE001128 001478 MOVE 001129 001482 MOVE001144 001498 PERFORM 001146 0014B4 PERFORM001150 0014EA STOP 001158 00150C CLOSE001163 001554 INITIALIZE 001165 001606 SET001168 001616 MOVE 001169 001622 MOVE001174 001644 IF 001175 001652 INITIALIZE - 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:
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.
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
GRACIAS
Genial manera de encontrar los errores de los dichosos SOC7!!!
diculpar, pero este codigo, donde lo ponemos.
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!
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