jueves, 26 de marzo de 2009

Donde ocurrio un 0C7

Hoy vamos a ver como detectar donde se produjo un error 0C7
(CEE3207S System detected a data exception(Code=0C7))

Cuando un programa finaliza con un error 0C7 quiere decir que en alguna parte del mismo se esta intentando asignar datos de un tipo no aceptado por la variable destino. Como podría ser intentar pasar letras a una variable numérica.... etc

En programas grandes suele ser muy dificultoso darse cuenta cual es la variable en conflicto por eso hoy vamos a utilizar datos de la compilación para poder identificar rápido y fácilmente donde se produce el error.

-El primer paso es ejecutar el programa, y luego de producirse el error acceder a la sysout del job y copiar las cifras significativas (6 ultimas) del offset en el que indica que sucede el error.

-Luego volvemos a compilar el programa pero agregando al job de compilacion los parametros LIST, MAP. Estos generaran una referencia cruzada entre los offset y las sentencias.

Ej:
//COBOLMVS EXEC PGM=VIACOBII,
//PARM=('C,RES,RENT,FSRT,NOSEQ,VBREF,TRUNC(OPT),OFF',
//'DATA(31),XREF,APOST,NONUM,LIST,MAP,NOOPT,LIB,F(I ,I)'),
//COND=(7,LT),REGION=4096K
//*STEPLIB DD DSN=SYS1.ADCOB.SIGYCOMP,DISP=SHR

-Finalizada la compilacion accedemos a la salida del Job de compilacion y buscamos el offset que teniamos. Alli nos encontraremos con el tipo de sentencia COBOL que produjo el error y un codigo de linea en el codigo sobre la cual se produjo el error.

Ej:
LINE # HEXLOC VERB
006469 000D6A MOVE
006480 000D8E STOP

-Buscamos ese codigo de linea en la sysout en la que estamos y encontraremos la linea exacta del codigo en la que se produjo el data exception.

Espero les haya sido util, y cualquier cosa no duden en preguntar.

Saludos

I see dead variables

He visto que mucha gente aveces tiene que limpiar el código en búsqueda de variables que no estén en uso y no sabe como hacerlo, se que revisar una a una por todo el código puede llegar a ser muy tedioso, por eso acá les dejo una forma de agilizar lo un poco.

Lo que vamos a hacer es generar en la compilación una lista cruzada entre las variables y las posiciones en las que se están usando, ya con esto solo tendríamos que ver en la lista que variables no se estan usando en ninguna posicion y tendriamos todas las variables sin referencia para borrarlas.

Para generar esta lista debemos editar el job de compilacion que estemos usando y pasarle el parametro XREF. Este parametro es el que se encargara de generar la lista cruzada en la sysout.

Veamos un ejemplo.
En esta procion de Job de compilacion podemos ver los parametros

//COBOLMVS EXEC PGM=VIACOBII,
//PARM=('C,RES,RENT,FSRT,NOSEQ,VBREF,TRUNC(OPT),OFF',
//'DATA(31),XREF,APOST,NONUM,LIST,MAP,NOOPT,LIB,F(I,I)'),
//COND=(7,LT),REGION=4096K
//*STEPLIB DD DSN=SYS1.ADCOB.SIGYCOMP,DISP=SHR

Luego de correr el Job con el parametro XREF, vamos al spool y bsucamos en la salida del Job la leyenda...
'Cross-reference of data names'
Seguido a esto aparecen listadas todas las variables con sus referencias.
Ej:
58 WS-VARIABLE1
63 WS-VARIABLE2. . . . . . . . . 4302
64 WS-VARIABLE3. . . . . . . . . 4301

Como se ve en este ejemplo las variables 2 y 3 son utilizadas en las lineas 4302 y 4301 respectivamente. Pero la variable1 NO ESTA EN USO.

Inicio del Blog

Esta es la primera entrada del blog y por eso no voy a escribir de ningún tema en particular sino dedicar un par de lineas a contar de que se trata y cual es el objetivo de este blog.

Inicio este blog con la intención de compartir con el resto de la comunidad cobolera mis experiencias y aprendizajes en el ambiente del cobol. Llevo trabajando unos años en OS/390 Y Z/OS por ello la mayoria de mis entradas iran orientadas al uso del cobol en estos sistemas, pero los invito a ustedes a mandarme articulos relacionado con COBOL o lenguajes con los que convive para ser subidas al blog.

Espero que juntos podamos aramar una buena base de referencia para todos los coboleros.

Les dejo mi email desafiocobol@gmail.com.

Saudos