Tous les articles par Mr COBOL

ASRA

Afin d’éviter de faire tomber le moniteur CICS lorsqu’une erreur est provoquée par une transaction, CICS émet un ordre SVC pour intercepter l’abend.

Ainsi par exemple, lors d’une opération arithmétique condensée avec des variables EBCDIC en COBOL (ce qui déclenche un program check au niveau du système d’exploitation), l’abend obtenu n’est pas le même qu’en environnement batch (qui produit un abend system S0C7 ).

Lorsque le système d’exploitation détecte le program check, il redonne le contrôle à CICS qui abandonne la tâche par un code qui lui est propre : ASRA. Tout abend ASRA signifie qu’un programme a commis une violation de type program check.

En COBOL, généralement cette erreur est due à une tentative d’opération arithmétique sur des variables qui ont des types d’images mixtes, ou qui n’ont pas été correctement initialisées.

La première étape de l’analyse consiste à trouver l’endroit où s’est produit l’abend, c’est-à-dire de relever le PSW (program status word) au moment du program check. Cette information est disponible dans un dump, ou peut être retrouvée par EDF. Ensuite, il est nécessaire de trouver dans quel programme s’est produit l’erreur, et à partir de là l’instruction fautive. En général, le coupable est le programme qui était en cours d’exécution lors de l’abend.

AEIx / AEYx

Tous les codes AEIx et AEYx sont le résultat de conditions exceptionnelles rencontrées dans des programmes, et pour lesquelles aucune commande HANDLE CONDITION n’est active.

Le tableau de la page suivante liste les principaux codes abend de cette famille.

Après chaque code, figurent les informations suivantes : la condition exceptionnelle associée, le type de commande, et les valeurs correspondantes des champs EIBFN et EIBRCODE .

Les raisons de ces abend sont détaillées dans la brochure CICS/ESA Application

Programming Référence pour les conditions correspondantes.

Certaines erreurs, comme ILLOGIC et INVREQ, sont liées à plusieurs causes.

Par exemple, sur un abend ILLOGIC, l’octet 1 du champ EIBRCODE contient le code retour VSAM et l’octet 2 contient le code erreur VSAM.

Si l’on détermine que la condition est le résultat d’une erreur de logique dans le programme, il faut corriger le programme et refaire le test.

Si par contre cette condition peut survenir normalement, il est nécessaire d’ajouter une commande HANDLE CONDITION dans le programme et de la gérer.

Liste des principaux codes abend de la famille AEIx et AEYx

CodeConditionServiceEIBFNEIBRCODE
AEIAERROR N/AN/A
AEIKTERMIDERRICP1012
AEILFILENOTFOUNDFCP0601
AEIMNOTFNDFCP0681
  OU ICP1081
AEINDUPRECFCP0682
AEIPINVREQFCP0608
  OU TSP0A20
  OU PCP0EE0
AEIQIOERRFCP0680
AEIRNOSPACEFCP0683
  OU TSP0A08
AEISNOTOPENFCP060C
AEITENDFILEFCP060F
AEIUILLOGICFCP0602
AEIVLENGERRFCP06E1
  OU TSP0AE1
  OU ICP10E1
AEIZITEMERRTSP0A01
AEI0PGMIDERRPCP0E01
AEI1TRANSIDERRICP1011
AEI3INVTSREQICP1014
AEI8IOERRTSP0A04
  OU ICP1004
AEI9MAPFAILBMS1804
AEYBINVMPSZBMS1808
AEYHQIDERRTSP0A02

Informations supplémentaires:

En absence d’une commande HANDLE CONDITION, les conditions exeptionnelles suivantes auront comme effet un arrêt anormal de la tâche avec un code retour abend au noveau de l’interface correspondant au tableau ci-dessous

CODECONDITION
AEIAERROR
AEIDEOF
AEIEEODS
AEIGINBFMH
AEIHENDINPT
AEIINOVAL
AEIJNOSTART
AEIKTERMIDERR
AEILDSIDERR
AEIMNOTFND
AEINDUPREC
AEIODUPKEY
AEIPINVREQ
AEIQIOERR
AEIRNOSPACE
AEISNOTOPEN
AEITENDFILE
AEIUILLOGIC
AEIVLENGERR
AEIWQZERO
AEIZITEMERR
AEI0PGMIDERR
AEI1TRANSIDERR
AEI2ENDDATA
AEI3INVISREQ
AEI8ISIOERR
AEI9MAPFAIL
AEYAINVERRTERM
AEYBINVMPSZ
AEYCIGREQID
AEYEINVLDC
AEYGJIDERR
AEYHQIDERR
AEYJDSSTAT
AEYKSELNERR
AEYLFUNCERR
AEYMUNEXPIN
AEYNNOPASSBKRD
AEYONOPASSBKWR
AEYPSEGIDERR
AEYRISCINVREQ
AEYTENDVDEFERR
AEYUIGREQCD
AEYVSESSIONERR
AEYYNOTALLOC
AEYZCBIDERR
AEY1INVPARTNSET
AEY2INVPARTN
AEY3PARTNFAIL

AFCA

Ce code abend survient lors de l’utilisation d’un fichier en statut DISABLED.

Ce code se produit rarement. Si le fichier est fermé pour une quelconque raison, et si cette condition n’est pas gérée, c’est le code abend AEIS qui est émis à la place.

En cas d’abend AFCA, le fichier incriminé peut être retrouvé par la transaction CEMT suivante :

CEMT INQUIRE DATASET ( nom-fichier )

Le problème disparaît dès que le fichier est rendu disponible.

AICA

Un abend AICA intervient lorsque CICS détecte qu’un programme est en train de boucler.

La situation de boucle dépend de fa quantité de temps écoulé entre l’exécution de deux commandes CICS. Si le temps est plus long que le temps imparti à la tâche (intervalle fixé par le paramètre ICVR de la SIT), CICS considère que le programme boude et le termine par un abend AICA.

Lorsqu’il y a une boucle, il est nécessaire de déterminer l’endroit où elle se trouve. Avec AICA, on sait par définition qu’elle se situe après la dernière commande CICS exécutée et avant l’exécution de toute autre commande CICS en séquence logique.

Sous EDF, la dernière commande est facilement localisée. A partir du listing du programme il est possible de trouver la prochaine commande attendue. Si la recherche est vaine, il faut analyser le contenu des variables de la Working Storage. Le plus souvent, ces valeurs associées à la connaissance de la logique du programme permettent de déterminer où l’on se trouve dans le code.

Si d’avantage d’informations sont nécessaires, il faut travailler avec EDF ou les dumps de transaction.

Avec EDF, on choisit un ordre CICS dont on est sûr qu’il n’est pas exécuté. On l’utilise comme condition d’arrêt en saisissant son numéro d’ordre translateur (si l’option DEBUG a été utilisée) ou son adresse hexadécimale, sur l’écran STOP CONDITIONS (option PF9). Ensuite, on laisse le programme se dérouler.

Si la boucle est éloignée dans le code, supprimer les affichages (option suppress display).

Si le programme atteint la condition d’arrêt, alors on sait que l’ordre CICS a été exécuté. Il faut marquer un autre ordre CICS au delà de celui-ci’ et répéter le processus. Si l’ordre n’est pas exécuté avant l’apparition de l’abend AICA, il faut marquer un ordre CICS entre ce dernier et ledébut de la boucle. Il faut répéter le processus jusqu’à la localisation de la boucle.

La technique employée avec les dumps de la transaction est sensiblement la même, excepté qu’il faut noter d’un seul coup tous les ordres à analyser, et placer une commande DUMP derrière chacun d’eux, avec un identifiant DMPCODE différent. Ensuite, il faut lancer le programme et analyser les dumps produits. La séquence des DMPCODEs permet de localiser la portion du code exécuté, et de vérifier le contenu de la Working Storage disponible à chacun de ces points de capture.

Remarques importantes sur AICA

Dans les versions les plus récentes de CICS, le système utilise le temps ” réel ” plutôt que le temps ” processeur ” pour détecter les boucles. Ainsi, il est possible qu’une transaction se termine par un abend AICA sans pour autant qu’il y ait une boucle. Ceci peut se produire dans le cas où la valeur du paramètre ICVR est trop faible, mais aussi dans le cas où il y a de nombreuses interférences entre la région CICS et les autres régions concurrentes, ou encore pour les deux raisons à la fois. S’il existe un doute sur la validité de l’abend AICA, il faut augmenter la valeur du paramètre ICVR et répéter plusieurs fois la transaction. Si c’est un ” vrai ” abend AICA, la dernière commande CICS exécutée sera toujours la même

Certaines commandes CICS ne passent pas par le contrôle de tâche et par conséquent ne peuvent pas réinitialiser l’intervalle de durée de la tâche.

APCT

Ce code abend survient lors d’une tentative d’exécution d’un programme qui est, soit en statut DISABLED, soit non défini dans un groupe RDO actif, ou lorsqu’une map ou un autre load module référencé par l’application ne peut être trouvé.

Pour des programmes HLPI, le code APCT ne peut survenir que lors de l’appel du premier programme de la transaction. Après le démarrage du premier programme, le même type d’abend peut survenir (sur une commande LINK ou XCTL, par exemple), mais dans ce cas c’est un code abend AEI0 qui est produit.

Ainsi, la cause d’un abend APCT est l’une des suivantes :

  1. Le programme référencé sur une commande DEFINE TRANSACTION n’a pas été défini par une commande DEFINE PROGRAM
  2. Le programme est en statut DISABLED

Les programmes peuvent être mis en statut DISABLED, soit par l’opérateur, soit par CICS lui-même lors d’un comportement inadapté du programme. Généralement la cause la plus fréquente est que CICS ne peut localiser le programme dans la bibliothèque des load-modules lors de sa phase de démarrage, et le marque pour cette raison DISABLED. Dans ce cas, il faut effectuer les vérifications suivantes :

• Le nom du programme dans la bibliothèque des load-modules doit correspondre au nom dans le CSD, et le programme doit avoir été correctement link-édité dans cette librairie

• Le nom du programme sur la commande DEFINE TRANSACTION doit être identique celui de la commande correspondante DEFINE PROGRAM

• Le programme est en statut ENABLED. Pour trouver le statut du programme au moment l’abend APCT, soumettre la transaction suivante :

CEMT INQUIRE PROGRAM (nom-programme)

ASRB

Un abend ASRB survient la plupart du temps pour les mêmes raisons que ASRA, mais il est le résultat d’un abend OS autre que les program check communs.

Si CICS est capable de gérer le problème, il termine la transaction par un abend ASRB.

La démarche à suivre pour trouver la source du problème est la même que celle employée pour un abend ASRA.

Un abend OS est peu probable sauf en tant que program check dans un programme CICS command level, ainsi ASRB est moins commun qu’ASRA.

ATNI

Une erreur de terminal provoque un abend ATNI et s’accompagne d’un dump de la transaction.

L’application ne reçoit plus le contrôle et le contact avec l’écran est perdu.

EIBFN

Contient un code identifiant la dernière commande CICS émise par la tâche (la mise à jour est effective lorsque la fonction est terminée). Le premier octet indique le type de commande: X’06’ pour une commande de fichier, X’08’ pour une commande BMS, etc. Le second octet précise la commande: 0602 signifie READ, 0604 signifie WRITE, etc.

Format : PIC X(2).

voir aussi AEIx et AEYx

Le tableau suivant donne la liste des codes et des commandes correspondantes.

Les codes 82nn et 84nn sont utilisés par l’interface CICS/ESA Front End Programming Interface. Consulter la brochure CICS/ESA Front End Programming Interface Feature User’s Guide pour plus de détails.

Liste des valeurs du champ EIBFN :

CODECOMMANDE
0202ADDRESS
0204HANDLE CONDITION
0206HANDLE AID
0208ASSIGN
020AIGNORE CONDITION
020CPUSH
020EPOP
0210ADDRESS SET
0402RECEIVE
0404SEND
0406CONVERSE
0408ISSUE EODS
040CWAIT TERMINAL
040EISSUE LOAD
0410WAIT SIGNAL
040AISSUE COPY
0412ISSUE RESET
0414ISSUE DISCONNECT
0416ISSUE ENDOUTPUT
0418ISSUE ERASEAUP
041AISSUE ENDFILE
041CISSUE PRINT
041EISSUE SIGNAL
0420ALLOCATE
0422FREE
0424POINT
0426BUILD ATTACH
0428EXTRACT ATTACH
042AEXTRACT TCT
042CWAIT CONVID
042EEXTRACT PROCESS
0430ISSUE ABEND
0432CONNECT PROCESS
0434ISSUE CONFIRMATION
0436ISSUE ERROR
0438ISSUE PREPARE
043AISSUE PASS
043CEXTRACT LOGONMSG
043EEXTRACT ATTRIBUTES
0602READ
0604WRITE
0606REWRITE
0608DELETE
060AUNLOCK
060CSTARTBR
060EREADNEXT
0610READPREV
0612ENDBR
0614RESETBR
0802WRITEQ TD
0804READQ TD
0806DELETEQ TD
0A02WRITEQ TS
0A04READQ TS
0A06DELETEQ TS
0C02GETMAIN
0C04FREEMAIN
0E02LINK
0E04XCTL
0E06LOAD
0E08RETURN
0E0ARELEASE
0E0CABEND
0E0EHANDLE ABEND
1002ASKTIME
1004DELAY
1006POST
1008START
100ARETRIEVE
100CCANCEL
1202WAIT EVENT
1204ENQ
1206DEQ
1208SUSPEND
1402WRITE JOURNALNUM
1404WAIT JOURNALNUM
1602SYNCPOINT
1802RECEIVE MAP
1804SEND MAP
1806SEND TEXT
1808SEND PAGE
180APURGE MESSAGE
180CROUTE
180ERECEIVE PARTN
1810SEND PARTNSET
1812SEND CONTROL
1C02DUMP
1E02ISSUE ADD
1E04ISSUE ERASE
1E06ISSUE REPLACE
1E08ISSUE ABORT
1E0AISSUE QUERY
1E0CISSUE END
1E0EISSUE RECEIVE
1E10ISSUE NOTE
1E12ISSUE WAIT
1E14ISSUE SEND
2002BIF DEEDIT
4802ENTER TRACENUM
4804MONITOR
4A02ASKTIME ABSTIME
4A04FORMATTIME
5E06CHANGE TASK
5E22WAIT EXTERNAL
5E32WAITCICS
6A02QUERY SECURITY
6C02WRITE OPERATOR
6C12ISSUE DFHWTO
7402SIGNON
7404SIGNOFF
7E02DUMP TRANSACTION
7E04DUMP SYSTEM

EIBRCODE

Contient le code réponse CICS renvoyé après l’exécution de la dernière commande émise par la tâche. Avec les nouvelles commandes CICS, pour lesquelles les champs EIBRESP et EIBRESP2 sont importants pour la signification de la condition rencontrée, l’octet 3 du champ EIBRCODE contient la même valeur que celle du champ EIBRESP . Toute information complémentaire est portée par le champ EIBRESP2 , et non pas par EIBRCODE.

Dans le cas d’une réponse normale, ce champ contient zéro hexadécimal (6X’00’).

Toutes les informations de ce champ peuvent être utilisées dans les programmes par des commandes HANDLE CONDITION.

Format : PIC X(6).

EIBRESP

Contient un numéro correspondant à la condition RESP rencontrée. ces numéros sont listés dans le tableau suivant (en valeur décimale) sur la première colonne. La seconde colonne indique la condition rencontrée.

Voir aussi les options RESP, RESP2 et la fonction DFHRESP

Format: PIC S9(8) COMP.

CODECONDITION
00NORMAL
01ERROR
02RDATT
03WRBRK
04EOF
05EODS
06EOC
07INBFMH
08ENDINPT
09NONVAL
10NOSTART
11TERMIDERR
12FILENOTFOUND ou DSIDERR
13NOTFND
14DUPREC
15DUPKEY
16INVREQ
17IOERR
18NOSPACE
19NOTOPEN
20ENDFILE
21ILLOGIC
22LENGERR
23QZERO
24SIGNAL
25QBUSY
26ITEMERR
27PGMIDERR
28TRANSIDERR
29ENDDATA
30INVTSREQ
31EXPIRED
32RETPAGE
33RTEFAIL
34RTESOME
35TSIOERR
36MAPFAIL
37INVERRTERM
38INVMPSZ
39IGREQID
40OVERFLOW
41INVLDC
42NOSTG
43JIDERR
44QIDERR
45NOJBUFSP
46DSSTAT
47SELNERR
48FUNCERR
49UNEXPIN
50NOPASSBKRD
51NOPASSBKWR
53SYSIDERR
54ISCINVREQ
55ENQBUSY
56ENVDEFERR
57IGREQCD
58SESSIONERR
59SYSBUSY
60SESSBUSY
61NOTALLOC
62CBIDERR
63INVEXITREQ
64INVPARTNSET
65INVPARTN
66PARTNFAIL
69USERIDERR
70NOTAUTH
72SUPPRESSED
73WRONGSTAT
74NAMEERROR
76CCERROR
77MAPERROR
80NOSPOOL
81TERMERR
82ROLLEDBACK
83END
84DISABLED
85ALLOCERR
86STRELERR
87OPENERR
88SPOLBUSY
89SPOLERR
94LOADING

Exemple: utilisation de la zone EIBRESP sur une commande RECEIVE MAP

WORKING-STORAGE SECTION.
01 CODE-RETOUR PIC S9(8) COMP.

PROCEDURE DIVISION.

EXEC CICS RECEIVE
   MAP(NOM-MAP)
   MAPSET(NOM-MAPSET)
   INTO(ZONE-MAP)
END-EXEC

IF EIBRESP = DFHRESP(MAPFAIL)
  GO TO RESTAURER-ECRAN
END-IF

IF EIBRESP NOT = DFHRESP(NORMAL)
  GO TO AUTRES-ERREURS
END-IF