bЂ~ TRACE.BCKQ  TRACE.BCKoBACKUP/VERIFY/INTERCHANGE/COMMENT=Routines to replace VMS traceback DISK$USER_S01:[FF.DCL.TRACE] TRACE.BCK/SAVE!Routines to replace VMS traceback FF_3100  vj-V5.3 _OMFS01::   _OMFS01$DKB300: V5.3 ~ x*[FF.DCL.TRACE]BUILD_TRACE.COM;1+,&0./ 4C-o0123KPWO56; -7Y9-89GHJ($ ! Create the traceback shareable image$ macro traceback1$ link/notrace/share traceback,sys$input:/optionscluster=vector,0collect=vector,traceback_vectorgsmatch=lequal,1,0-$ ! Create the trace_routines shareable image$ macro/debug trace_routines$ message trace_messagesC$ link/share/debug trace_routines,trace_messages,sys$input:/optionsgsmatch=lequal,2,1universal=condition_handler$ exit*[FF.DCL.TRACE]TRACEBACK.DOC;1+,M./ 4H4-o0123KPWO56ں-7@:F9-89GHJ/ *****************/ * TRACEBACK.DOC */ *****************General description:G This module is designed to replace DEC default traceback handler. It'sA called by VMS when an unhandled error occurs. Activation is madeA trought the LIB$TRACE logical (witch point to TRACEBACK.EXE). AsD decribed in the VMS Microfiches (module TBKSTART), a special vectorD must be present at address 0. This vector describe the data portionF of the image (starting and ending address in the two first longwords)G and the image entry point (in the third longword). It also seems to beD neccessary to define the image first transfert vector to this entry point.G As found in many tests, it seems that this image is not activated withC a normal context. For example, it seems that .ADDRESS (and .ASCID)H references are not correctly supported. To avoid manual redefinition ofD all .ADDRESS references, this module only contains a "bootstrap" toE "normaly" activate a shareable image nammed "TRACE_ROUTINES", and toD call it a the "CONDITION_HANDLER" entry point. CONDITION_HANDLER isG called like a condition handler (that is, with 2 parameters, the firstG is the signal array describing the error, the second a mechanism array> template with all longs set to zero (including preceding FP).H As for the "normal" traceback, the program will be $EXITed or continued( depending on the severity of the error.C Note that VMS will not call TRACEBACK.EXE if the (user's) image is linked /NOTRACEBACK.Files:! This package contains two files:# TRACEBACK.MAR: contains the code. TRACEBACK.DOC: this file. Installation: To get a shareable image, use: $ macro traceback2 $ link/notrace/share traceback,sys$input:/options cluster=vector,0 collect=vector,traceback_vector $ exitLogical definition:G To replace the DEC standard traceback, just define a LIB$TRACE logicalH to this shareable image. You can define it in process/user/group/systemH or other specific table (ie $ DEFINE LIB$TRACE disk:[dev]TRACEBACK.EXE)D As this module activate TRACE_ROUTINES as shareable image, you mustE define a logical to point TRACE_ROUTINES (ie $ DEFINE TRACE_ROUTINES? disk:[dev]TRACE_ROUTINES.EXE), or copy the image in SYS$SHARE.Contacting the author:@ Comments, suggestions, and questions about this software can be9 directed to the author at one of the following addresse: Francois FOUCHET France MATIF Automatique 52, avenue des Champs Elysees 75008 PARIS FRANCE Phone: (+33) (1) 42 25 66 25 Fax: (+33) (1) 42 25 72 450 Mails to DECUS France Server: DECUSF::FOUCHET_F Disclaimer:D This software is in the public domain and may be freely distributedB without charge as required. However, this notice and reference to. the author in the source must be left intact.? This software is provided "AS IS". The author and France MATIFA Automatique disclaim all warranties on the software and its use,H including without limitation, all implied warranties of merchantabilityF and fitness, and shall, in no event, be liable for any loss of profitF or any other commercial damage, including but not limited to special,B incidental, consequential of other damages. USE AT YOUR OWN RISK.*[FF.DCL.TRACE]TRACEBACK.MAR;1+, ./ 4I-o0123KPWO56<;-7x9-89GHJ2 .title traceback : replace DEC traceback routines .ident /V1.0-0/;++;.; Facility: General utilities - Trace routines;E; Warning: *** THIS MODULE USE UNSUPPORTED FEATURES AND LOCATIONS ***;; Functional description:;H; This module is designed to replace DEC default traceback handler. It'sB; called by VMS when an unhandled error occurs. Activation is madeG; trought the LIB$TRACE logical (witch point to this file). As decribedD; in the VMS Microfiches (module TBKSTART), a special vector must beD; present at address 0. This vector describe the data portion of theG; image (starting and ending address) and the image entry point (in theE; third longword). It also seems to be neccessary to define the image-; first transfert vector to this entry point.;H; As found in many tests, it seems that this image is not activated withD; a normal context. For example, it seems that .ADDRESS (and .ASCID)I; references are not correctly supported. To avoid manual redefinition ofE; all .ADDRESS references, this module only contains a "bootstrap" toF; "normaly" activate a shareable image nammed "TRACE_ROUTINES", and toE; call it a the "CONDITION_HANDLER" entry point. CONDITION_HANDLER isH; called like a condition handler (that is, with 2 parameters, the firstH; is the signal array describing the error, the second a mechanism array?; template with all longs set to zero (including preceding FP).;I; As for the "normal" traceback, the program will be $EXITed or continued); depending on the severity of the error.;D; Note that VMS will not call TRACEBACK.EXE if the (user's) image is; linked /NOTRACEBACK.; ; Warning:;D; This module use an undocummented/unsupported feature, witch can be-; changed/removed in a future version of VMS.;; Environment: VAX/VMS;; Link information:; ; To get a shareable image, use:;; $ macro traceback3; $ link/notrace/share traceback,sys$input:/options; cluster=vector,0!; collect=vector,traceback_vector; $ exit;; Execution information:;H; To replace the DEC standard traceback, just define a LIB$TRACE logicalI; to this shareable image. You can define it in process/user/group/systemI; or other specific table (ie $ DEFINE TRACEBACK disk:[dev]TRACEBACK.EXE);E; As this module activate TRACE_ROUTINES as shareable image, you mustF; define a logical to point TRACE_ROUTINES (ie $ DEFINE TRACE_ROUTINES?; disk:[dev]TRACE_ROUTINES.EXE) or copy the image in SYS$SHARE.;6; Author: Francois FOUCHET, Creation-date: 14-Jan-1991; France MATIF Automatique ; 52, avenue des Champs Elysees; 75008 PARIS ; FRANCE;; Phone: (+33) (1) 42 25 66 25; Fax: (+33) (1) 42 25 72 452; Mails to DECUS France Server: DECUSF::FOUCHET_F;; Modified by:; ; Disclaimer:;E; This software is in the public domain and may be freely distributedC; without charge as required. However, this notice and reference to/; the author in the source must be left intact.;@; This software is provided "AS IS". The author and France MATIFB; Automatique disclaim all warranties on the software and its use,I; including without limitation, all implied warranties of merchantabilityG; and fitness, and shall, in no event, be liable for any loss of profitG; or any other commercial damage, including but not limited to special,C; incidental, consequential of other damages. USE AT YOUR OWN RISK.;;--  .sbttl Data definition .disable global ;+ ; Define constants ;- $ssdef ; system error code $stsdef ; status offsets# $dscdef ; descriptor constants .extrn lib$find_image_symbol ;+ ; Define the "magic" vector.;> ; The first long contains the writable data starting address,@ ; the second the writable data ending address and the third the ; code entry point. ;-/ .psect traceback_vector,long,pic,shr,exe,nowrt .address data .address data_end .address traceback_code+2 ;+ ; Define writable data;= ; As specified, for some obscure reasons, .ADDRESS reference. ; seems to not work at image activation time.; ;-6 .psect traceback_data,noexe,wrt,noshr,pic,longdata:0symbol_value: ; Contains the shareable image! .long 0 ; entry point addressBsymbol: .ascii "CONDITION_HANDLER" ; This is the entry point name(symbol_len = . - symbol ; Name length&symbol_desc: ; Create a descriptor' .word symbol_len ; for symbol string .byte dsc$k_dtype_t .byte dsc$k_class_s1symbol_address: ; Address will be supplied at .long 0 ; run time+filename: ; This is the shareable image .ascii "TRACE_ROUTINES" ; name+filename_len = . - filename ; Name lengthfilename_desc: ; Descriptor .word filename_len .byte dsc$k_dtype_t .byte dsc$k_class_s3filename_address: ; Address will also be defined .long 0 ; at run time,mechanism_array: ; Pseudo mechanism array .long 4 ; Elements count .long 0 ; FP .long 0 ; Depth .long 0 ; Saved R0 .long 0 ; Saved R16 ; As certains soft read the 5th long to see if called> ; by LIB$SIGNAL or LIB$STOP, we supply a long to avoid accvio" .long 0 ; Flag lib$signal/stop data_end: .sbttl code- .psect traceback_code,exe,nowrt,shr,pic,long .entry traceback_code,^m<> ;+) ; Supply address for the two descriptors ;-2 movab symbol,symbol_address ; Get symbol address7 movab filename,filename_address ; Get filename address ;+2 ; Activate image and return the image entry point ;-. pushal symbol_value ; Returned symbol value- pushal symbol_desc ; Get this symbol value* pushal filename_desc ; ... in this file. calls #3,g^lib$find_image_symbol ; ... please blbc r0,1$ ; Error case- tstl symbol_value ; Is the symbol defined? beql 1$ ; No, exit ;+$ ; Simulate a condition handler call ;-- pushab mechanism_array ; Mechanims array @- movl 4(ap),r0 ; Point the traceback vector pushl 12(r0) ; Signal array@1 movl symbol_value,r0 ; Get routine entry point1 calls #2,(r0) ; Call like a condition handler1$: ;+ ; Get the error code ;-- movl 4(ap),r0 ; Point the traceback vector! movl 12(r0),r0 ; Signal array@% movl 4(r0),r0 ; Extract error code ;+ ; Extract severity ;-0 cmpzv #sts$v_severity,- ; Is the error severe? #sts$s_severity,r0,- #sts$k_severe" beql 2$ ; Yes, $EXIT the image ;+ ; Continue if less than severe ;-) movzwl #ss$_continue,r0 ; Else continue ret ; Return to caller2$: ;+ ; Else exit the image ;-6 bisl2 #sts$m_inhib_msg,r0 ; Don't edit error message $exit_s r0 ; See you! .end traceback_code*[FF.DCL.TRACE]TRACEBACK.TXT;1+,./ 4I-o0123KPWO 56O-79-89GHJ / *****************/ * TRACEBACK.TXT */ *****************Description generale: F Ce module est destine a remplacer le traceback utilise par defaut parD VMS. Il est appelle par VMS lorsqu'une erreur non geree intervient.G L'activation est faite au travers du logical LIB$TRACE (qui pointe sur? TRACEBACK.EXE). Comme indique dans les Microfiches VMS (moduleB TBKSTART), un vecteur special doit etre present a l'adresse 0. CeE vecteur decrit la zone de donnees de l'image (adresse de debut et deH fin dans les 2 premiers lognwords) et l'adresse d'activation de l'imageB (3eme long). Il semble qu'il soit aussi neccessaire de definir leD premier vecteur de transfert de l'image sur ce meme point d'entree.G Apres de nombreux tests, il semble que cette image ne soit pas activeeE dans un contexte normal. Par exemple, il semble que les references a@ des .ADDRESS (et par extension .ASCID) ne soit pas correctementI suportees. Afin d'eviter de nombreuses redefinition manuelles, ce moduleF contiend uniquement une "amorce" pour activer "normalement" une imageA partageable nommee "TRACE_ROUTINES", et pour l'appeller au pointB d'entree "CONDITION_HANDLER". CONDITION_HANDLER sera (habilement)D appellee comme un condition handler (original, non ?), c'est a dire@ avec 2 parametres, le premier etant un "signal array" decrivantD l'erreur, le second un pseudo "mechanism array" dont tous les longsC sont a zero (y compris celui qui decrit le pointeur de trames (FP) precedent).E Comme pour le traceback standard, l'image sera continuee ou detruite selon la gravite de l'erreur.G Notez que VMS n'appellera pas TRACEBACK.EXE si l'image utilisateur est linkee /NOTRACEBACK. Fichiers:" TRACEBACK.MAR: contiend le code.+ TRACEBACK.DOC: documentation (en anglais), TRACEBACK.TXT: documentation (en francais) Installation:= Pour obtenir une image partageable, utilisez les commandes : $ macro traceback2 $ link/notrace/share traceback,sys$input:/options cluster=vector,0 collect=vector,traceback_vector $ exitNoms logiques :E Pour remplacer le traceback DEC, il suffit de definir un nom logiqueA LIB$TRACE pour qu'il pointe cette image partageable. Vous pouvezE definir ce nom logique dans n'importe quelle table de noms logiques.; (par exemple : $ DEFINE LIB$TRACE disk:[dev]TRACEBACK.EXE)F Comme ce module active l'image partageable TRACE_ROUTINES, vous devezC definir un nom logique pour pointer cette image, ou la copier dansF SYS$SHARE (ex : $ DEFINE TRACE_ROUTINES disk:[dev]TRACE_ROUTINES.EXE)Pour joindre l'auteur :D Commentaires, suggestions et questions sur ces modules peuvent etre7 adresses directement a l'auteur a l'adresse suivante : Francois FOUCHET France MATIF Automatique 52, avenue des Champs Elysees 75008 PARIS FRANCE! Telephone: (+33) (1) 42 25 66 25 Fax: (+33) (1) 42 25 72 455 Mail sur le serveur DECUS France : DECUSF::FOUCHET_FMise en garde :> Ce logiciel est dans le domaine public et peut etre distribue? gratuitement, tant que ce texte et les coordonnees de l'auteur restent dans le code source.@ Ce logiciel est donne dans l'etat. Ni l'auteur, ni France MATIFA Automatique ne consentent aucune garantie, expresse ou impliciteF concernant ce logiciel ou l'utilisation de ce dernier, y compris sansA limitation, toute garantie se rapportant a la commerciabilite duD logiciel ou a sa convenance a un usage particulier, et ne pourront,B en aucune maniere, etre tenu responsable de quelconques pertes ouB dommages, directes ou indirects, resultant de l'utilisation de ceE logiciel. VOUS UTILISEZ CE LOGICIEL SOUS VOTRE PROPRE RESPONSABILITE ET VOS RISQUES ET PERILS."*[FF.DCL.TRACE]TRACE_MESSAGES.MSG;1+,./ 4UL-o0123KPWO56x-79-89GHJ0.TITLE Error messages for error tracing modules!.! Facility: General utilities - Trace routines! ! Functional description:! ?! This module contains error message used by TRACE_ROUTINES.MARC! You can translate ERROR_DETECTED message to your native language.! The message format is:!1! ERROR_DETECTED /FAO=2! |<------+------->|4! +--> Replace this by your preferred message!J! Note : you may want to insert some spaces before this text to indent it.!! Environment: VAX/VMS! 6! Author: Francois FOUCHET, Creation-date: 11-Oct-1989! France MATIF Automatique ! 52, avenue des Champs Elysees! 75008 PARIS ! FRANCE!! Phone: (+33) (1) 42 25 66 25! Fax: (+33) (1) 42 25 72 452! Mails to DECUS France Server: DECUSF::FOUCHET_F! ! Disclaimer:!E! This software is in the public domain and may be freely distributedC! without charge as required. However, this notice and reference to/! the author in the source must be left intact.!@! This software is provided "AS IS". The author and France MATIFB! Automatique disclaim all warranties on the software and its use,I! including without limitation, all implied warranties of merchantabilityG! and fitness, and shall, in no event, be liable for any loss of profitG! or any other commercial damage, including but not limited to special,C! incidental, consequential of other damages. USE AT YOUR OWN RISK.!!.IDENT 'V1.0-0'!.FACILITY TRACE,15/PREFIX=TRACE__.BASE 1.SEVERITY SUCCESS .BASE 1000.SEVERITY WARNING .BASE 2000.SEVERITY ERROR .BASE 3000.SEVERITY INFORMATIONAL3PRIMINUSE .BASE 4000&CRASH UERROR_DETECTED /FAO=2.END"*[FF.DCL.TRACE]TRACE_ROUTINES.DOC;1+,. / 4I -o0123KPWO!56$-7 :-89GHJ02 **********************2 * TRACE_ROUTINES.DOC *2 **********************General description:G This package contains routines used to implement a general trace file.E This trace file can be considered as the central application tracingE point. It will contain two kinds of messages: user messages (such asF "record xxxx not found", "key xxxx is missing" ...), or stack dump ofA a crashing image. Note that end users don't see the traceback onH screen. This traceback is replaced by a "nice" message, as "Fatal error0 detected - Please consult your system manager".G The trace file is located by the logical TRACE_FILE. If not defined, aG file nammed TRACE_FILE.LOG is created in the current directory. Access& to this file is serialized by a lock.G Each process using the trace file write a standard header. This headerD begin with one line of "=". The second line contains the PID of theF process, username used, and the translation of 3 application logicalsC (nammed log_1, log_2, and log_3). The third line contains the nodeF name (as this file is clusterwide), the terminal name (can be null ifB not in interactive mode), and the default device/directory. Last? header line contains the full image name and the process image5 activation count. Following is an example of header:E ====================================================================: PID 208000AC - User FF - Log_1 DEV - Log_2 FF - Log_3 FMAC Node OMFS01 - Terminal LTA367: - Default DISK$USER_S01:[FF.DATMEM]E Image OMFS01$DKB300:[FF.DATMEM]DATA_IN_MEMORY_UPDATE.EXE;1 - Count 1H Following this header, we found the messages send by the process to theG trace file. These messages are preceded by a line stamping the currentA date/time. This time stamp is valid for 4 seconds (that is, willH contains messages send by this process for 4 seconds, after that, other< messages will be time stamped by one other date/time line).I ----------------------- 19-NOV-1990 18:28:00.31 ------------------------' Updating process is starting on OMFS01A Status 00000001 (%SYSTEM-S-NORMAL, normal successful completion)I ----------------------- 22-OCT-1990 15:59:45.67 ------------------------2 An error occured during Forms$receive execution. E Status 00D5C2D2 (%FORMS-E-PROC_ESCAPE_ERR, request terminated due to+ severe error in procedural escape routine)H When an unhandled error occurs, internal condition handler will write aG traceback to the trace file. This traceback will contains standard DEC4 traceback, plus the following specific information: - label preceding PC.# - block name if PC is in a block. - routine entry point. - transfer vectors. - AST parameter value.8 - LIB$INITIALIZE and LIB$INITIALIZE_COROUTINE symbols.8 - GST informations for (shareable) images without DST.I ----------------------- 31-OCT-1990 11:49:29.75 ------------------------ Symbolic stack dump followsG Module name routine name line rel PC abs PCI PASRTL PAS$HANDLER 00000116 0022E6E2> ----- above condition handler called with exception 002D808C:0 %TSS-F-ERROPNRLB, error opening request library -RMS-E-FNF, file not found# -SYSTEM-W-NOSUCHFILE, no such file ----- end of exception messageI TSSSHR TSS$RELEASE_CTX_A 00001C6C 001C7E58I TSSSHR TSSFDV$WAIT 0000203B 001C5B91I TSSSHR TSSFDV$WAIT 00001E8F 001C59E5I TSSSHR TSS$SIGNAL 0000000C 001C610AI DISP_PROG DISP_PROG 689 0000089C 00144CC4I -- block TEST-RET-STATUS 00000019 00144CC4I CALLED_FUNCTION CALLED_FUNCTION 72 0000003E 00149D5EI -- block BEGIN 00000021 00149D5EI ITVENV CALL_FUNCTION 464 000000B7 00173267I ITVENV ITVPRG 571 0000023F 00172E8BI VITPRC VITPRC 41 000000B0 0013A998I VITPRC LIB$INITIALIZE_COROUTINE 001BC338 001BC538I TRACE_ROUTINES INIT_HANDLER 933 00000023 001BA84FI VITPRC LIB$INITIALIZE 001BC313 001BC513I ----------------------- 5-NOV-1990 14:26:05.67 ------------------------I %SYSTEM-F-INTDIV, arithmetic trap, integer divide by zero at PC=000CEE4A ,PSL=03C00022 Symbolic stack dump followsH Module name routine name line rel PC abs PCI RTXS_MODULE DISPLAY_RATES_ON_SCREEN 190 000001C2 000CEE4A DATA_IN_MEMORY_CODEI WATCH_LOCK1_GRANTED_AT_NL 4257 000000C8 00257CFEI -- label EXECUTE_USER_ROUTINE 00000035 00257CFE= ----- previous routine called as AST with parameter 00000005 DATA_IN_MEMORY_CODEI WATCH_CHANGES_ON 4034 00000140 00257AABI RTXSDIVENV START_OPTIONS_LOCK 1290 00000076 000CEB06I RTXS_MODULE INIT_OPPS 343 00000095 000CF245I FORMS$MANAGER FORMS$CANCEL 00031F6D 001DD0E1I FORMS$MANAGER FORMS$CANCEL 00001550 001AC6C4I FORMS$MANAGER FORMS$CANCEL 0000146D 001AC5E1I FORMS$MANAGER FORMS$CANCEL 000013B8 001AC52CI FORMS$MANAGER FORMS$CANCEL 00001176 001AC2EAI FORMS$MANAGER FORMS$RECEIVE 00000186 001AADFBI DOOR_PRG DOOR_PRG 666 0000023D 000C7C99I -- label HND_BREAK 000001F5 000C7C99I -- entred at DOOR_PROGRAM 55 00000000 000C7A5CI DOOR_MAIN DOOR_MAIN 69 00000047 000C7A47I -- block CALL-DOOR-PROGRAM 0000002A 000C7A47I CALLED_FUNCTION CALLED_FUNCTION 72 0000003E 000E86CAI -- block BEGIN 00000021 000E86CAI ITVENV CALL_FUNCTION 464 000000B7 000FC937I ITVENV ITVPRG 571 0000023F 000FC55BI VITPRC VITPRC 100 000000B1 0010C6E5I VITPRC LIB$INITIALIZE_COROUTINE 0011A40C 0011A60CI TRACE_ROUTINES INIT_HANDLER 953 00000023 001188C3I VITPRC LIB$INITIALIZE 0011A3E7 0011A5E7B Unless the logical TRACE_ON_SCREEN is equated to "Y" (or "y"), noB traceback is edited on screen. Instead, the TRACE__ERROR_DETECTEDG message text is edited (between escape sequences if on a terminal). IfE this message is not defined at link time, then a standard message is output on SYS$OUTPUT.@ If required (option selected at compilation time), the standardD traceback will be redirected to a file. This file is located by theE INDIVIDUAL_TRACE_FILE logical, default to INDIVIDUAL_TRACE_FILE.LOG.G Due to problems using DECFORMS (when errors are detected in proceduralD escape routines), the logical TRACE_ALL_EXCEPTIONS as been created.E When defined to "Y" (or "y"), internal condition handler is setup asF primary exception vector (exclusive with DEBUG use). Each error is soE traced BEFORE calling user's handlers (and before being dismissed by DECFORMS condition handler).: The following global entry points can be called by users:1 - open_trace_file (open the general trace file) - close_trace_file (close it)6 - write_trace_file (write a message and/or a status)& - trace_error (write an error code)- - trace_error_vector (write an error array)= - crash_in_trace_file (crash current process in trace file)< - condition_handler (condition handler to write traceback)Customization:: You can modify the 3 application logical names located in< TRACE_ROUTINES.MAR. They are defined by .ASCID statement at6 label log_1_lognam:, log_2_lognam: and log_3_lognam:.A Replace the contents of these ASCID location by your applicationI logicals names. You can also modify ASCID message located at begin_mes:.I You can translate ERROR_DETECTED message (located in TRACE_MESSAGES.MSG)2 into your native language. The message format is:0 ERROR_DETECTED /FAO=2 |<------+------->|3 +--> Replace this by your preferred messageFiles:# This package contains three files:, TRACE_ROUTINES.MAR: contains all the code.& TRACE_MESSAGES.MSG: define messages. TRACE_ROUTINES.DOC: this file. Installation:9 TRACE_ROUTINES.MAR must be compiled using MACRO compiler$ (ie $ MACRO/DEBUG TRACE_ROUTINES).: TRACE_MESSAGES.MSG must be compiled using MESSAGE command (ie $ MESSAGE TRACE_MESSAGES)> These two modules must be linked with user's code using LINK ; (ie $ LINK/DEBUG user_code,TRACE_ROUTINES,TRACE_MESSAGES)H You can choose to include these routines in a user library pointed by a LNK$LIBRARY logical.B If you build a shareable image including TRACE_ROUTINES, you mustC remind that, in this case, the call to LIB$INITIALIZE is correctlyF made at image startup, but an immediate return is coded in the calledH co-routine. So, the condition handler set by INIT_HANDLER is immediatly2 removed. There is no workaround for this problem.G Note: to give optimal informations, modules linked with TRACE_ROUTINESD must be compiled /DEBUG. Executable size will grow, but these DEBUGE records have no impact on in-memory executable size (unless they are" mapped by the traceback handler).Logical definition:3 You can define the following logicals at run time:: TRACE_FILE: full name of general trace file. Default to , TRACE_FILE.LOG in your default directory.B TRACE_ON_SCREEN: display (also) messages on screen if defined to8 "Y". Usefull when debugging programs. Default to "N".A TRACE_ALL_EXCEPTIONS: write ALL exception to trace file, BEFORE8 calling user's handlers if defined to "Y". Usefull to2 detect errors in DECFORM's PEU. Default to "N".< INDIVIDUAL_TRACE_FILE: full name of individual trace file.7 Default to INDIVIDUAL_TRACE_FILE.LOG in your default9 directory. Used only if individual_trace is defined at compliation time.Contacting the author:@ Comments, suggestions, and questions about this software can be9 directed to the author at one of the following addresse: Francois FOUCHET France MATIF Automatique 52, avenue des Champs Elysees 75008 PARIS FRANCE Phone: (+33) (1) 42 25 66 25 Fax: (+33) (1) 42 25 72 450 Mails to DECUS France Server: DECUSF::FOUCHET_F Disclaimer:D This software is in the public domain and may be freely distributedB without charge as required. However, this notice and reference to. the author in the source must be left intact.? This software is provided "AS IS". The author and France MATIFA Automatique disclaim all warranties on the software and its use,H including without limitation, all implied warranties of merchantabilityF and fitness, and shall, in no event, be liable for any loss of profitF or any other commercial damage, including but not limited to special,B incidental, consequential of other damages. USE AT YOUR OWN RISK.User informations:= Following pages contains user callable routines description. 2 OPEN_TRACE_FILE ROUTINEFunctional description:@ This routine open the trace file for append and write a header.Calling sequence: call open_trace_file ()Completion codes: Always return SS$_NORMAL 3 CLOSE_TRACE_FILE ROUTINEFunctional description:# This routine close the trace file.Calling sequence: call close_trace_file ()Completion codes: Always return SS$_NORMAL 3 WRITE_TRACE_FILE ROUTINEFunctional description:C This routine prov0y~ TRACE.BCKo"[FF.DCL.TRACE]TRACE_ROUTINES.DOC;1I 7ide the way to edit one message and/or one statusD longword. It can be used to signal problems in services completion. Here is one example in BASIC:" STAT = SYS$QIOW (... ,IOSB, ...) IF (STAT AND 1%) = 0% THEN3 CALL WRITE_TRACE_FILE ("R0 error in $QIOW",STAT) END IF IF (IOSB AND 1%) = 0% THEN" MESSAGE = "IOSB error in $QIOW"( CALL WRITE_TRACE_FILE (MESSAGE, STAT) END IF= Unless currently opened, trace file will be open and closed.Calling sequence:+ call write_trace_file ([message][,status])Input parameters: Message: the message to write VMS usage: none2 Type: string (fixed, dynamic or varying of char) Access: read only Mechanism: by descriptor* Status: the status to translate and write VMS usage: cond_value Type: longword (unsigned) Access: read only Mechanism: by referenceCompletion codes: Always return SS$_NORMAL 0 TRACE_ERROR ROUTINEFunctional description:E This routine provide the way to edit a complete error message to theE trace file. User can substitute LIB$SIGNAL by TRACE_ERROR. ParameterE specification is the same as LIB$SIGNAL/STOP. Here is one example in BASIC:- CALL TRACE_ERROR (REM$_BADVALUE BY VALUE, & 1% BY VALUE, & PHONE_NUMBER BY DESC)= Unless currently opened, trace file will be open and closed.Calling sequence:6 call trace_error (status [,arg_count [,FAO_arg ...]])Input parameters:- Status: the condition code causing the error VMS usage: cond_value Type: longword (unsigned) Access: read only Mechanism: by value, Arg_count: count of following FAO arguments VMS usage: none Type: longword (signed) Access: read only Mechanism: by value: FAO_arg: FAO arguments associated with the condition code VMS usage: varying_arg Type: unspecified Access: read only Mechanism: by valueCompletion codes: Always return SS$_NORMAL 4 TRACE_ERROR_VECTOR ROUTINEFunctional description:D This routine provide the way to edit a complete error vector to theH trace file. Can be used to signal (for example) RDB error vector. Here is one example in BASIC:1 CALL TRACE_ERROR_VECTOR (RDB$MSG_VECTOR BY REF)= Unless currently opened, trace file will be open and closed.Calling sequence:) call trace_error_vector (message_vector)Input parameters: Message_vector: argument list VMS usage: varying_arg Type: unspecified Access: read only* Mechanism: by reference, array referenceCompletion codes: Always return SS$_NORMAL 4 CRASH_IN_TRACE_FILE ROUTINEFunctional description:A This routine provide the way to force the current image to crash with a traceback in trace file.Calling sequence: call crash_in_trace_file ()Completion codes: None. No return expected 3 CONDITION_HANDLER ROUTINEFunctional description:E This routine write a symbolic image traceback to the trace file. VMSF calls it as condition handler. This routine can be passed established' as condition handler by LIB$ESTABLISH.Calling sequence:7 call condition_handler (signal_array, mechanism array)Input parameters: Signal_array:  VMS usage: signal_array Type: signal_array Access: read only* Mechanism: by reference, array reference Mechanism array: VMS usage: mechanism_array Type: mechanism_array Access: read only* Mechanism: by reference, array referenceCompletion codes:- R0 contains SS$_RESIGNAL if routine returns."*[FF.DCL.TRACE]TRACE_ROUTINES.MAR;1+,./ 4NJ-o0123KPWO56`+-7k=:-89GHJjA .title trace_routines : modules to put information on trace file .ident /V2.1-11/;++;.; Facility: General utilities - Trace routines; E; Warning: *** THIS MODULE USE UNSUPPORTED FEATURES AND LOCATIONS ***;; Functional description:; G; This module contains routines used to implement a general trace file.D; This trace file will contains messages. These messages can be userD; messages (such as "record xxxx not found"), or the stack dump of aD; crashing image. The following global entry points can be called by ; users :;2; - open_trace_file (open the general trace file) ; - close_trace_file (close it)7; - write_trace_file (write a message and/or a status)A; - write_trace_file_var (for compatibility with previous softs)'; - trace_error (write an error code).; - trace_error_vector (write an error array)>; - crash_in_trace_file (crash current process in trace file)7; - trace_cond (for comptibility with previous softs)=; - condition_handler (condition handler to write traceback);H; The trace file is located by the logical TRACE_FILE. If not defined, aH; file nammed TRACE_FILE.LOG is created in the current directory. AccessF; to this file is serialized by a lock. The lock resource name includeH; a constant ("TRF_") and TRACE_FILE's device name and FID. We must takeC; an EX lock on this resource BEFORE writting in the file. To avoidE; problems, if, for some reason one process loop, a timer is setup atE; file open. When it expire, it force the trace file to be closed and>; release the lock. Currently, this timer is set to 5 seconds.;H; Each process using the trace file write a standard header. This headerE; begin with one line of "=". The second line contains the PID of theG; process, username used, and the translation of 3 application logicalsA; (nammed log_1, log_2, log_3) . The third line contains the nodeG; name (as this file is clusterwide), the terminal name (can be null ifC; not in interactive mode), and the default device/directory. Last@; header line contains the full image name and the process image; activation count.;I; Following this header, we found the messages send by the process to theH; trace file. These messages are preceded by a line stamping the currentB; date/time. This time stamp is valid for 4 seconds (that is, willI; contains messages send by this process for 4 seconds, after that, other=; messages will be time stamped by one other date/time line).;H; At image startup time, LIB$INITIALIZE calls INIT_HANDLER. This routineA; setup some internals variables and declare CONDITION_HANDLER as9; condition handler. When called (at user request (usingI; CRASH_IN_TRACE_FILE) or by VMS when an error occurs), CONDITION_HANDLERH; will write a traceback to the trace file. This traceback will containsC; standard DEC traceback, plus the following specific information :;; - label preceding PC.$; - block name if PC is in a block.; - routine entry point.; - transfer vectors.; - AST parameter value.9; - LIB$INITIALIZE and LIB$INITIALIZE_COROUTINE symbols.9; - GST informations for (shareable) images without DST.;C; Unless the logical TRACE_ON_SCREEN is equated to "Y" (or "y"), noC; traceback is edited on screen. Instead, the TRACE__ERROR_DETECTEDH; message text is edited (between escape sequences if on a terminal). IfF; this message is not defined at link time, then a standard message is; output on SYS$OUTPUT.;D; Due to the time needed to compose the traceback in complex images,H; lines are first stored in a buffer and then flushed to the trace file,-; thus reducing file locking time to minimum.;B; To avoid header repetition if the same process iteratively callsI; OPEN_TRACE_FILE, the lock value block associated with the resource usedG; to synchronize trace file access is loaded with the PID and the image=; count of the last writter. This lock value block is read inG; OPEN_TRACE_FILE and a new header is written to the trace file only ifF; last writter was not the current process and the same image (count).;A; If required (option selected at compilation time), the standardE; traceback will be redirected to a file. This file is located by theF; INDIVIDUAL_TRACE_FILE logical, default to INDIVIDUAL_TRACE_FILE.LOG.B; This is done by defining the SYS$PUTMSG used by the standard DECE; traceback. The equivalence contains 3 words. The first contains theD; constant 1B (hexa, correspond to the ESC ascii char). The two last?; words correspond to the RMS ISI (internal file identifier) ofF; SYS$OUTPUT and SYS$ERROR respectively. If this option is used, or ifH; the signaled error is less than FATAL, condition handler will resignal/; the error, otherwise it will $EXIT the image.;I; Due to problems using DECFORMS (when errors are detected in user escapeC; routines), the logical TRACE_ALL_EXCEPTIONS as been created. When@; defined to "Y" (or "y"), CONDITION_HANDLER is setup as primaryF; exception vector (exclusive with DEBUG use). Each error is so tracedH; BEFORE calling user's handlers (and before being dismissed by DECFORMS; condition handler).;E; WARNING : Image header informations found in VMS Internals and DataI; Structures (V5), and DST informations found in the VMS microfiches, areI; completly UNSUPPORTED by DEC. They are accurate for VMS 5.3-1, but canH; change in future versions of VMS. GST informations found in the linker@; standard documentation and can (unless otherwise specified) be; supported by DEC.;; Environment: VAX/VMS; 6; Author: Francois FOUCHET, Creation-date: 11-Oct-1989; France MATIF Automatique ; 52, avenue des Champs Elysees; 75008 PARIS ; FRANCE;; Phone: (+33) (1) 42 25 66 25; Fax: (+33) (1) 42 25 72 452; Mails to DECUS France Server: DECUSF::FOUCHET_F; ; Modified by: ; (; V2.1-11 11-Jan-1991 - Francois FOUCHETB; Allow condition handler to be called by special code substitued@; to the normal (VMS) traceback (using LIB$TRACE logical name).;(; V2.1-10 10-Jan-1991 - Francois FOUCHET:; Edit entry point only if not in the same routine as PC. ; Declare all external symbols.(; Declare error code as WEAK reference.;'; V2.1-9 19-Nov-1990 - Francois FOUCHET@; Insert TRACE_FILE device and FID in synchronization resource.;'; V2.1-8 05-Nov-1990 - Francois FOUCHET-; Add primary exception handler declaration.;'; V2.1-7 31-Oct-1990 - Francois FOUCHET&; Add entry point lines in traceback.;'; V2.1-6 24-Oct-1990 - Francois FOUCHET; Remove test on last error.$; Exit image only for severe error.8; All routines (except get_log_name) return SS$_NORMAL.;'; V2.1-5 19-Oct-1990 - Francois FOUCHET@; Access vio if DMT contains one element with psect count equal ; to zero.;'; V2.1-4 19-Oct-1990 - Francois FOUCHET/; Change time between to headers to 4 seconds.-; Conditionaly create individual trace file.); Exit from image when called for crash.;'; V2.1-3 20-Apr-1990 - Francois FOUCHET!; Edit header at top a new file.;'; V2.1-2 18-Apr-1990 - Francois FOUCHET; Extract ENTRY symbols.; Fix a bug in IDC analysis.;'; V2.1-1 09-Apr-1990 - Francois FOUCHET0; Add condition handler in CRASH_IN_TRACE_FILE.?; Don't edit date header if messages are edited at near times.;'; V2.0-0 28-Mar-1990 - Francois FOUCHET; Add new traceback function.5; Add CONDITION_HANDLER and TRACE_COND entry points.;'; V1.1-0 19-Mar-1990 - Francois FOUCHET=; Add CONDITION_HANDLER handler and INIT_HANDLER procedure.; Add terminal name in header.; Use TRACEMSG message file.;'; V1.0-7 07-Mar-1990 - Francois FOUCHET@; Close trace_file and release lock if trace is opened for more; than 5 seconds.;'; V1.0-6 19-Feb-1990 - Francois FOUCHET; Changes in header.; Changes in error recovery.;'; V1.0-5 15-Feb-1990 - Francois FOUCHET-; Add TRACE_ERROR_VECTOR for pascal modules.;'; V1.0-4 12-Feb-1990 - Francois FOUCHET,; Add translation of LOG_1, LOG_2 and LOG_3/; Add translation of default device/directory.;'; V1.0-3 02-Feb-1990 - Francois FOUCHET@; Create new file with protection sy=rwed,ow=rwe,gr=rwe,wo=rwe.;'; V1.0-2 01-Feb-1990 - Francois FOUCHET;; Add WRITE_TRACE_FILE_VAR entry point for pascal modules.;'; V1.0-1 01-Feb-1990 - Francois FOUCHET9; Don't rewrite header if last message was issued by the; same process.;; Disclaimer :;E; This software is in the public domain and may be freely distributedC; without charge as required. However, this notice and reference to/; the author in the source must be left intact.;@; This software is provided "AS IS". The author and France MATIFC; Automatique disclaim all warranties on the software and it's use,I; including without limitation, all implied warranties of merchantabilityG; and fitness, and shall, in no event, be liable for any loss of profitG; or any other commercial damage, including but not limited to special,C; incidental, consequential of other damages. USE AT YOUR OWN RISK.;;--  .sbttl Constants definition .disable global/ .link "sys$system:sys.stb"/selective_search;++; Constants definitions;-- ;+ ; Define debug flags ;: ; All these flags are used as debugging tools, to display8 ; informations about image, DST, DMT or GST structures.: ; Enabling one or more flags will result in a performance: ; degradation during error tracing (and spurious messages ; to screen). ; ;- ;+> ; Debug_image controls output of image structure information. ;-;; debug_images = 1 ;+= ; Debug_entries controls output of entry point localisation. ;-;; debug_entries = 1 ;+= ; Debug_routines controls output of DST/GST routine records. ;-;; debug_routines = 1 ;+7 ; Debug_modules controls output of DST module records. ;-;; debug_modules = 1 ;+5 ; Debug_labels controls output of DST label records. ;-;; debug_labels = 1 ;+6 ; Debug_blocks controls output of DST blocks records. ;-;; debug_blocks = 1 ;+C ; Debug_lines controls output of DST PC lines correlation records. ;-;; debug_lines = 1 ;+, ; Debug_dst controls output of DST records. ;-;; debug_dst = 1 ;+, ; Debug_dmt controls output of DMT records. ;-;; debug_dmt = 1 ;+, ; Debug_gst controls output of GST records. ;-;; debug_gst = 1 ;+) ; If individual_trace is defined, then :; ; - the final (standard) traceback will be written to the5 ; file nammed by INDIVIDUAL_TRACE_FILE logical.7 ; - the condition handler will resignal ALL error (no ; $EXIT) ;? ; It used as debugging tool, to compare DEC traceback with the ; traceback of this module. ;-;; individual_trace = 1 ;+" ; Define system offsets/constants ;- $ssdef ; system error code $rmsdef ; rms error code $iodef ; io modifiers! $lnmdef ; logical name items $lckdef ; lock offsets# $dscdef ; descriptor constants $jpidef ; getjpi codes $syidef ; getsyi codes$ $psldef ; processor status code( $chfdef ; condition handler offsets $stsdef ; status offsets( $objdef ; object record definitions+ $epmmdef ; specifics object records $epmvdef ; ... $promdef ; ... $provdef ; ... $sdfmdef ; ... $sdfvdef ; ... $sdfwdef ; ...6 .library "sys$library:lib" ; following macros in LIB& $ihddef ; image header definition' $ihsdef ; image symbols definition ;+& ; Define ICB offsets (not documented) ;-icb$w_chan = 14icb$t_image_name = 20icb$s_image_name = 40icb$l_starting_address = 72icb$l_end_address = 76 ;+( ; Define DST constants (not documented) ;-)dst$k_version = ^x99 ; b=major, b=minor+dst$k_rtnbeg = ^xbe ; b=mask, l=@, s=name#dst$k_rtnend = ^xbf ; b=?, l=size(dst$k_blkbeg = ^xb0 ; b=?, l=@, s=name#dst$k_blkend = ^xb1 ; b=?, l=size1dst$k_lblorlit = ^xba ; b=type, l=value, s=name/dst$k_psect = ^xb8 ; b=?, l=@, s=name, l=size'dst$k_label = ^xbb ; b=?, l=@, s=name/dst$k_modbeg = ^xbc ; b=?, l=language, s=namedst$k_modend = ^xbd ; n/a+dst$k_entry = ^xb5 ; b=?, l=value, s=name dst$k_prolog = ^xb2 ; b=?, l=@$dst$k_line_num = ^xb9 ; b=type, ??2dst$k_delta_pc_w = ^x1 ; line num type definitiondst$k_incr_linum = ^x2dst$k_incr_linum_w = ^x3dst$k_set_linum_incr = ^x4dst$k_set_linum_incr_w = ^x5dst$k_reset_linum_incr = ^x6dst$k_beg_stmt_mode = ^x7dst$k_end_stmt_mode = ^x8dst$k_set_linum = ^x9dst$k_set_pc = ^xadst$k_set_pc_w = ^xbdst$k_set_pc_l = ^xcdst$k_set_stmtnum = ^xddst$k_term = ^xedst$k_term_w = ^xfdst$k_set_abs_pc = ^x10dst$k_delta_pc_l = ^x11dst$k_incr_linum_l = ^x12dst$k_set_linum_b = ^x13dst$k_set_linum_l = ^x14dst$k_term_l = ^x15 ;+" ; Define internal image structure ;-img_l_forward = 0#img_l_backward = img_l_forward + 4%img_t_image_name = img_l_backward + 4#img_s_image_name = icb$s_image_name7img_l_image_begin = img_t_image_name + img_s_image_name(img_l_image_end = img_l_image_begin + 4(img_w_image_number = img_l_image_end + 4'img_w_channel = img_w_image_number + 2"img_l_dst_vbn = img_w_channel + 2#img_l_dst_size = img_l_dst_vbn + 4#img_l_gst_vbn = img_l_dst_size + 4#img_l_gst_size = img_l_gst_vbn + 4#img_l_dmt_vbn = img_l_gst_size + 4#img_l_dmt_size = img_l_dmt_vbn + 4(img_k_structure_len = img_l_dmt_size + 4 ;+ ; Define structures length ;-(fao_buf_len = 255 ; FAO buffer length%usr_nam_len = 12 ; Username length(img_nam_len = 255 ; Image name length&nod_nam_len = 15 ; Node name length*ter_nam_len = 15 ; Terminal name length1system_handler = ^x80000014 ; System handler @)ff_reqidt = ^xff ; timer request ident ;+$ ; Define externals symbols/routines ;-4 .extrn iac$gl_image_list,sys$gl_astret,sec$m_expreg3 .extrn lib$put_output,lib$signal,lib$stop,lib$subx9 .extrn sys$exit,sys$expreg,sys$fao,sys$getmsg,sys$putmsg) .extrn sys$setddir,sys$setexv,sys$trnlnm ;+ ; Define error message codes ;- ;= ; Note : there is no problems if these codes are not defined< ; at link time (that is, if you don't link this module with ; the message file). ;: .weak trace__crash,trace__error_detected,trace__priminuse ;+ ; Macro definitions ;-0 .macro check_status error_label=error,?ok_label blbs r0,ok_label brw error_label ok_label: .endm check_status  .sbttl user data definition;++; Local data storage;--K .psect trace_routines_data,pic,usr,ovr,rel,gbl,noshr,noexe,wrt,quad .align quad!trc_fab: ; FAB for trace file $fab fnm=, - dnm=<.LOG>,- org=seq,- rfm=var,- rat=cr,- fac=put,- shr=,- fop=,- nam=trc_nam,- xab=trc_prot .align quad!trc_rab: ; RAB for trace file $rab fab=trc_fab, - rop=eof .align quad'trc_nam: ; NAM block for trace file $nam .align quadtrc_prot: ; Protection XAB $xabpro pro= .if defined individual_trace .align quad/indtrc_fab: ; FAB for individual trace file% $fab fnm=, - dnm=<.LOG>,- org=seq,- rfm=var,- rat=cr,- fac=put,- shr=shrget,- fop= .align quad/indtrc_rab: ; RAB for individual trace file $rab fab=indtrc_fab .endc .align longbuffer_first_free_byte: .address message_buffer%message_buffer: ; internal buffer' .blkb 4096 ; 50 lines of 80 chars !message_buffer_end: .address message_buffer_end .align longtrnlnm_item_list:trnlnm_ret_len: .word 0 ; Buffer length .word lnm$_string ; Item codetrnlnm_ret_adr: .long 0 ; Buffer addresstrnlnm_ret_len_adr:# .long 0 ; Return length address .long 0 ; End of item list .align long2jpilst: .word usr_nam_len ; Item list for GETJPI( .word jpi$_username ; Return username .address usr_nam_buf .address usr_nam_dsc .word 4c .word jpi$_pid ; Return PID .address pide .long 0d .word 41- .word jpi$_imagecount ; Return image count  .address imgcnt .long 0: .word img_nam_lenU* .word jpi$_imagname ; Return image name .address img_nam_bufn .address img_nam_dsco .word ter_nam_lent- .word jpi$_terminal ; Return terminal namee .address ter_nam_bufs .address ter_nam_dscn' .long 0 ; End of item listx .align longt2syilst: .word nod_nam_len ; Item list for GETSYI) .word syi$_nodename ; Return node namer .address nod_nam_bufc .address nod_nam_dscl4 .long 0 ; End of item list .align longw pid: .long 0aimgcnt: .long 0is_open:.byte 0 was_opened:c .byte 0y .align longf&usr_nam_dsc: ; Username descriptor .word usr_nam_lenr .byte dsc$k_dtype_to .byte dsc$k_class_s_ .address usr_nam_buf usr_nam_buf: .blkb usr_nam_len ; Username .align long (img_nam_dsc: ; Image name descriptor .word img_nam_lenw .byte dsc$k_dtype_t  .byte dsc$k_class_se .address img_nam_buf img_nam_buf:! .blkb img_nam_len ; Image nameL .align longt+ter_nam_dsc: ; Terminal name descriptori .word ter_nam_lenk .byte dsc$k_dtype_te .byte dsc$k_class_s( .address ter_nam_buf ter_nam_buf:$ .blkb ter_nam_len ; Terminal name .align longO'nod_nam_dsc: ; Node name descriptorb .word nod_nam_lena .byte dsc$k_dtype_t  .byte dsc$k_class_si .address nod_nam_buf nod_nam_buf: .blkb nod_nam_len ; Node name .align longu(out_dsc: ; Output message descriptor .word fao_buf_len .byte dsc$k_dtype_t  .byte dsc$k_class_s out_adr: .address fao_mes .align longd%fao_dsc: ; FAO message descriptors .word fao_buf_len .byte dsc$k_dtype_tp .byte dsc$k_class_sn .address fao_mes .align longdfao_mes: ; Message .blkb fao_buf_lenesaved_fao_mes: .blkb fao_buf_lenc .align long ,err_dsc: ; Error text message descriptor .word fao_buf_len .byte dsc$k_dtype_tt .byte dsc$k_class_st .address err_mes .align long err_out_dsc: .word fao_buf_len .byte dsc$k_dtype_ty .byte dsc$k_class_s  .address err_meseerr_mes:! .blkb fao_buf_len ; Error texte .align longT dummy_desc:p .word 1o .byte dsc$k_dtype_ti .byte dsc$k_class_s  .address dummy_charr dummy_char:f .blkb 1t .if defined individual_tracem .align longr#phynam: ; Item list for CRELNMa .word isi_s_length .word lnm$_stringR .address isi_s .long 0i .long 0 ; End of lista%isi_s: .word ^x11b ; ISI structured .word 0c .word 0sisi_s_length = . - isi_s_ .endc .align longw'lksb: .long 0 ; Synchronization locklkid: .long 0val_blk: vbl_pid:.long 0 ; Copy of PID(vbl_img:.long 0 ; Copy of image count .quad 0 ; 8 spare byteso .align long unlock_timer:i .quad 0 ; Same in binary4next_header_time: ; Date/time of next time header .quad 0.work_quad: ; working quad .quad 0Iiosb: ; One IOSB, one ! .quad 0s/line_address: ; point empty/line number mesw .long 0/stmt_address: ; point empty/stmt number mesa .long 0(lib_init_addr:& .long 0 ; LIB$INITIALIZE calling @lib_init_coroutine:C( .long 0 ; LIB$INITIALIZE coroutine @'image_queue_addr: ; address of aboves .address image_queue ,image_queue: ; image internal queue list .quad 0$.image_dyn_mem: ; image queue allocated mem .quad 0b map_adr: ; DST/GST mapping @ .quad 0rmap_adr1: ; DMT mapping @ .quad 0e&dmt_valid: ; Not zero if DMT valid .byte 0m/dst_gst_index: ; last DST/GST index in img_p .word 0a$dst_gst_flag: ; indicate DST/GST .byte 0l dst_flag = 1 ; it's a DST gst_flag = 2 ; it's a GST/line_count: ; count of signaled error linesg .byte 0 *trace_on_screen: ; trace on screen flag .byte 0'tt_channel: ; channel to sys$outputt .word 0t .align long4in_normal_handler: ; not zero if "normal" handler .long 0c/previous_handler: ; previous primary handlerp .long 0e!last_error: ; last error codeb .long 0dlast_pc: ; last error pc .long 0%last_depth: ; last depth signaledt .long 0U .align long./symbolize_beg: ; block used by SYMBOLIZE_PCbpc_to_symbolize: ; pc .long 0e$image_name: ; image name (ascic) .blkb 64&module_name: ; module name (ascic) .blkb 64-module_dst_addr: ; @ of module name in DST .long 0t"module_begin: ; module begin @ .long 0S2best_module_dst_addr: ; @ of best module in DST .long 0l(routine_name: ; routine name (ascic) .blkb 64*routine_dst_addr: ; @ of routine in DST .long 0&best_routine: ; pc of best routine .long 0 4best_routine_dst_addr: ; @ of best routine in DST .long 0E$label_name: ; label name (ascic) .blkb 64'label_dst_addr: ; @ of label in DSTp .long 0x(best_label: ; pc of best label found .long 0 0best_label_dst_addr: ; @ of best label in DST .long 0i$block_name: ; block name (ascic) .blkb 64'block_dst_addr: ; @ of block in DST .long 0S"best_block: ; pc of best block .long 0T0best_block_dst_addr: ; @ of best block in DST .long 0 &line_number: ; current line number .long 01-best_line_number: ; best line number found .long 0t+stmt_number: ; current statement numbera .long 0n2best_stmt_number: ; best statement number found .long 0npc_line: ; current pcu .long 0o.best_pc_line: ; pc of best line/stmt found .long 0o$increment: ; line/stmt increment .long 10$line_stmt_flag: ; line/stmt flag .byte 02"symbolize_len = . - symbolize_beg2last_best_routine: ; saved copy of best_routine .long 0iresnam: .word resnam_lenJ .byte dsc$k_dtype_tH .byte dsc$k_class_sh .address resbeg 8resbeg: .ascii "TRF_" ; Synchronization resource nameresdvi: .quad 0 .quad 0aresfid: .word 0 .word 09 .word 0sresnam_len = . - resbeglog_1_translation: .ascid "*NOT DEF*"log_2_translation: .ascid "*NOT DEF*"log_3_translation: .ascid "*NOT DEF*"def_dev:+ .ascid "*NOT DEF* "Idef_dir:+ .ascid "*NOT DEF* "2unlock_interval: .ascid "0 ::5" ; 5 secondsheader_interval: .ascid "0 ::4" ; 4 seconds log_1_lognam:c .ascid "LOG_1" log_2_lognam:l .ascid "LOG_2" LOG_3_lognam:2 .ascid "LOG_3"def_dev_lognam:R .ascid "SYS$DISK"rtrnlnm_tab_name: .ascid "LNM$FILE_DEV"trace_on_screen_lognam:e .ascid "TRACE_ON_SCREEN"trace_all_exceptions_lognam: .ascid "TRACE_ALL_EXCEPTIONS" screen_mes:n) .ascid <27>"[24;1H"<27>"[K"<27>"[1m"<7> screen_reset_mes:4 .ascid <27>"[m"<27>"[23;1H"end_of_line_mes: .ascii <13><10>o%end_of_line_len = . - end_of_line_mesd empty_mes: .ascid ""E .if defined individual_tracealnm$process_table:1 .ascid "LNM$PROCESS_TABLE" ; Process table nameo5putmsg: .ascid "SYS$PUTMSG" ; Logical to be createdC .endc2output: .ascid "SYS$OUTPUT" ; Output device namedefault_error_message: .ascid <13><10><7>- "** Fatal error detected"-R- " - Please contact your system manager **"f&separate_mes: ; Separation message .ascid "!80*="&begin_mes: ; First line of message7 .ascid "PID !XL - User !AS - Log_1 !AS - Log_2 !AS "-n "- Log_3 !AS"def_mes:3 .ascid "Node !AS - Terminal !AS - Default !AS!AS"L'image_mes: ; Second line of message .ascid "Image !AS - Count !UL" time_mes:E .ascid "!27*- !%D !28*-" end_time_mes:0> .ascid "!8*> !%D - Trace file closed by internal timer !9*<"trace_signal_mes:o4 .ascid "Tracing error due to TRACE_ALL_EXCEPTIONS" status_mes: .ascid "Status !XL (!AS)"C*line_mes: ; format used to edit line # .ascid "!5UL"i,line_number_mes: ; line number descriptor .ascid "12345"*stmt_mes: ; format used to edit stmt # .ascid ".!UL"O,stmt_number_mes: ; stmt number descriptor .ascid ".12"block_name_mes:1 .ascic "-- block"alabel_name_mes:  .ascic "-- label" entry_point_mes: .ascic "-- entred at" header_1_mes:e& .ascid "Symbolic stack dump follows" header_2_mes: @ .ascid "Module name routine name line"- " rel PC abs PC"N;xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxx.xx xxxxxxxx xxxxxxxx1pc_mes: .ascid "!15AC !31AC !5AS!3AS !XL !XL"apc_mes1:.ascid "!AC" header_3_mes:r? .ascid "----- above condition handler called with exception"-h " !XL:" header_4_mes:f) .ascid "----- end of exception message" ast_mes:? .ascid "----- previous routine called as AST with parameter"- " !XL"wlib_init_call_mes: .ascic "LIB$INITIALIZE"ilib_init_coroutine_mes:s# .ascic "LIB$INITIALIZE_COROUTINE"a .if defined debug_imagesbimage_info_mes:fA .ascid "Image !AC starting at !XL, ending at !XL, channel !XW"-e "!/ DST vbn !UL, size !UW"- "!/ GST vbn !UL, count !UW"-  "!/ DMT vbn !UL, count !UL" .endc .if defined debug_lines line_num_mes: .ascid "type !UB, value !XL" pc_is_mes:, .ascid "new pc is !XL, line !UL, stmt !UL" .endc .if defined debug_dstdst_mes:= .ascid "type !XB, size !UB, byte !XB, long !XL, string !AC"i not_def_mes: .ascic "** not def **" .endc .if defined debug_dmtdmt_mes:4 .ascid "DST offset !XL, size !UL, psect count !UL" psect_mes:. .ascid " PSECT start !XL, end !XL, size !UL" .endc .if defined debug_gstgst_mes:+ .ascid "type !XB, sub-type !XB, size !UW"  .endc .if defined debug_modules module_mes:r .ascid "module !AC" .endc .if defined debug_routinesD routine_mes:# .ascid "routine !AC start at !XL"cpc_requested_mes:b$ .ascid "routine to find is at !XL" .endc .if defined debug_labelsc label_mes:! .ascid "label !AC start at !XL"D .endc .if defined debug_blocksb block_mes:! .ascid "block !AC start at !XL" .endc .if defined debug_entries entries_mes:0 .ascid "longs preceding return PC are !XL !XL"entries_read_mes:p5 .ascid "can't read code preceding return PC at !XL"g entry_pc_mes:;( .ascid "routine entry point is at !XL" .endc  .sbttl initialization code;;++d;c:; These definitions are used to call INIT_HANDLER at image=; startup time (for more informations on LIB$INITIALIZE, seeg; VAX RTL manual, chapter 7). ;t;--i .extrn lib$initializeF .psect lib$initialize nopic,usr,con,rel,gbl,noshr,noexe,rd,nowrt,long .address init_handler E .sbttl init_hanǥ2~ TRACE.BCKo"[FF.DCL.TRACE]TRACE_ROUTINES.MAR;1N|6dler routine1 .psect trace_routine_code,exe,nowrt,shr,pic,long;++;; ; Functional description:c; B; This routine is called by LIB$INITIALIZE at image startup to setD; "CONDITION_HANDLER" as ... condition handler. Some system and userI; informations are also read in global variables. If TRACE_ALL_EXCEPTIONSeI; is defined to "Y", CONDITION_HANDLER is also setup as primary exceptionc;; vector (except if this primary vector is already in use). ; ; Calling sequence:f; 3; call init_handler (init_coroutine, cli_coroutine)e; ; Input parameters:n; 7; Init_coroutine : initialization coroutine entry point $; VMS usage : procedure entry point; Type : longword (unsigned)o; Access : read only;; Mechanism : by reference; +; Cli_coroutine : cli coroutine entry point $; VMS usage : procedure entry point; Type : longword (unsigned)y; Access : read onlyo; Mechanism : by referencea; ; Implicit inputs:; ; Read node name using $GETSYIJ; Read username, image name and count, PID and terminal name using $GETJPIH; Read the fisrt translation of LOG_1, LOG_2, LOG_3,TRACE_ALL_EXCEPTIONSE; and SYS$DISK logicals using tables specified in LNM$FILE_DEV table.m;e; Output parameters:; ; None; ; Implicit outputs:$; ; None; ; Completion codes:m; 4; R0 contains the value set by the called coroutine.; ; Side effects:a; /; Setup one condition handler in current framel); Can setup the primary exception vector$,; Can open a channel on the current terminal; Call init coroutine=; ;-- .entry init_handler,^m<>,: subl3 #1,16(fp),lib_init_addr ; LIB$INITIALIZE calling @? subl3 #2,4(ap),lib_init_coroutine ; LIB$INITIALIZE coroutine @,& bsbb collect_data ; Init local data: bsbw setup_primary_vector ; Set primary exception vector8 movab condition_handler,(fp) ; Setup condition handler% callg (ap),@4(ap) ; Call coroutinew ret ; Here at image exit= 6 ;+$ ; Initialize local data ;-n collect_data:x0 $bintim_s - ; Convert delta time in quadword timbuf = unlock_interval,- timadr = unlock_timere! $getsyiw_s - ; Read node name itmlst = syilst $getjpiw_s -c/ itmlst=jpilst ; Get Job Process Informationn$ locc #^a/ /,usr_nam_dsc,usr_nam_buf1 subw2 r0,usr_nam_dsc ; Trim spaces in username;& pushal log_1_translation ; Get LOG_1 pushal log_1_lognam calls #2,g^get_log_name& pushal log_2_translation ; Get LOG_2 pushal log_2_lognam calls #2,g^get_log_name& pushal log_3_translation ; Get LOG_3 pushal log_3_lognam calls #2,g^get_log_name" pushal def_dev ; Get SYS$DISK: pushal def_dev_lognam calls #2,g^get_log_name* pushal dummy_desc ; Get TRACE_ON_SCREEN pushal trace_on_screen_lognam calls #2,g^get_log_name blbc r0,2$ ; Doesn't exist cmpb dummy_char,#^a"Y"_ bneq 1$ mnegb #1,trace_on_screen_1$: cmpb dummy_char,#^a"y" bneq 2$ mnegl #1,trace_on_screeni-2$: pushal def_dir ; Get default directory pushal def_dir= pushl #0O calls #3,g^sys$setddire( tstw ter_nam_dsc ; Using a terminal ? beql 3$ ; no $assign_s - ; Assign TT  devnam = output,-_ chan = tt_channelm3$: rsbe h ;+y ; Set primary exception vectors ;-asetup_primary_vector:^/ pushal dummy_desc ; Get TRACE_ALL_EXCEPTIONSx# pushal trace_all_exceptions_lognamx calls #2,g^get_log_name blbc r0,5$ ; Doesn't exist cmpb dummy_char,#^a"Y", beql 4$ cmpb dummy_char,#^a"y"x bneq 5$4$: pushal previous_handlers pushl #0  pushab condition_handlert pushl #0; calls #4,g^sys$setexv0 tstl previous_handler ; any previous handler ? beql 5$ ; no ;+ & ; Reinstall previous exception vector ;-n pushl #0s pushl #0h pushl previous_handler pushl #0k calls #4,g^sys$setexv6 tstl #trace__priminuse ; message correctly defined ? beql 5$ ; no4 pushl #trace__priminuse ; primary vector is in use4 calls #1,g^lib$signal ; (certainly used by DEBUG)5$: rsb. t .sbttl open_trace_file routine;++ ;a; Functional description:p;tB; This routine get a synchronization lock, open the trace file forG; append, define SYS$PUTMSG in user mode in process logical table (used,H; by the traceback handler to write crash information), write 3 lines of+; header messages and return to the caller.>;J; To avoid trace file locking (in case of process loop, a timer is armed.;D; Timer's completion AST force the trace file closing and unlock it.; ; Calling sequence:a;f; call open_trace_file ()a;; Input parameters:c;n; None;p; Implicit inputs:;E; None;d; Output parameters:;; None;a; Implicit outputs: ; ; None;u; Completion codes: ;m; Always return SS$_NORMAL; ; Side effects: ;g@; Take an exclusive lock to synchronize access to the trace file; Open the trace file.@; Arm a sanity timer (to force trace file closing and unlocking); ;--i .entry open_trace_file, ^m<>n) tstb is_open ; Trace already opened ?s beql 1$ ; No, continue! movzwl #ss$_normal,r0 ; Say ok6 ret,1$: movb #-1,is_open ; Set flag trace open& tstl lkid ; Lock already granted ?$ bneq 10$ ; yes, convert it to EX .if defined individual_trace ;+d ; Open individual trace filel ;-t $create - fab=indtrc_fab check_status 2$ $connect -g rab=indtrc_rab check_status 2$ ;+  ; Define SYS$PUTMSG logical ;-# movw indtrc_rab+rab$w_isi, isi_s+2l# movw indtrc_rab+rab$w_isi, isi_s+4 $crelnm_s - tabnam = lnm$process_table, -r lognam = putmsg, - itmlst = phynam, - acmode = #psl$c_user .endc ;+g ; Open trace file ;- 2$: $create - fab=trc_fab  check_status close_trace. $connect -d rab=trc_rab check_status close_tracet ;+g ; Get the synchronization lock. ;-s: movq trc_nam+nam$t_dvi,resdvi ; Copy first 8 bytes of DVI= movq trc_nam+nam$t_dvi+8,resdvi+8 ; Copy last 8 bytes of DVI_7 movl trc_nam+nam$w_fid,resfid ; Copy 2 first FID wordsl7 movw trc_nam+nam$w_fid+4,resfid+4 ; Copy last FID wordE8 $enqw_s lkmode=#lck$k_exmode,- ; Take a new lock in EX lksb=lksb,- resnam=resnam,-s" flags=#lck$m_system!lck$m_valblk brb 15$ ;+i ; Open trace file ;-:10$: $create - fab=trc_fabs check_status close_tracec $connect - rab=trc_rab check_status close_trace 8 $enqw_s lkmode=#lck$k_exmode,- ; Convert from NL to EX lksb=lksb,-s0 flags=#lck$m_system!lck$m_valblk!lck$m_convert ;+a ; Test $ENQ completionl ;-l.15$: check_status close_trace ; R0 error case movzwl lksb,r0e2 cmpl r0,#ss$_valnotvalid ; Value block not valid bneq 16$ ; Nob$ clrq vbl_pid ; Clear value block& movzwl #ss$_normal,r0 ; Clear error016$: check_status close_trace ; LKSB error case ;+_ ; Edit header if needed ;-.: cmpl trc_fab+fab$l_sts,#rms$_created ; new file created ? beql 20$ ; yes, edit headera0 cmpl vbl_pid,pid ; Same process as previous ? bneq 20$ ; No, edit header7 cmpl vbl_img,imgcnt ; Same image count as previous ?r bneq 20$ ; Noo brw 30$20$: pushal fao_dsc ; Bufadr pushal out_dsc ; Msglen pushal separate_mes ; Message( calls #3,g^sys$fao ; Convert in ascii bsbw write_mes ; Edit message" pushal log_3_translation ; LOG_3" pushal log_2_translation ; LOG_2" pushal log_1_translation ; LOG_1 pushal usr_nam_dsc ; username pushl pid ; Job # pushal fao_dsc ; Bufadr  pushal out_dsc ; Msglene pushal begin_mes ; Message_( calls #8,g^sys$fao ; Convert in ascii bsbw write_mes ; Edit message& pushal def_dir ; Default directory# pushal def_dev ; Default devicer% pushal ter_nam_dsc ; Terminal name! pushal nod_nam_dsc ; Node name_ pushal fao_dsc ; Bufadr_ pushal out_dsc ; Msglen_ pushal def_mes ; Message( calls #7,g^sys$fao ; Convert in ascii bsbw write_mes ; Edit message pushl imgcnt_ pushal img_nam_dscd pushal fao_dsc ; Bufadrl pushal out_dsc ; Msglend pushal image_mes ; Messagen( calls #5,g^sys$fao ; Convert in ascii bsbw write_mes ; Edit message brb 40$ ; edit headeri ;+g ; Time stamp if necessary ;-o&30$: $gettim_s - ; Get current time timadr = work_quad pushal work_quad ; result pushal work_quad ; b  pushal next_header_time ; ak& calls #3,g^lib$subx ; compute a - b movq work_quad,r0 ; test quad bgeq 50$ ; ok, skip 40$: pushl #0p pushal fao_dsc ; Bufadr pushal out_dsc ; Msglen  pushal time_mes ; Message( calls #4,g^sys$fao ; Convert in ascii bsbw write_mes ; Edit message& $bintim_s - ; Next header interval timbuf = header_interval,- timadr = next_header_timem" $gettim_s - ; Get current time timadr = work_quad" pushal next_header_time ; result pushal next_header_time ; bc pushal work_quad ; ai& calls #3,g^lib$subx ; compute a - b ;+ ; Arm a five seconds timere ;- 50$: $setimr_s - daytim = unlock_timer,- $ astadr = forced_close_trace_file,- reqidt = #ff_reqidt  movl #ss$_normal,r0 ; Say okd ret ;+:% ; Write fao buffer to the trace filea ;-1 write_mes:3 movw out_dsc,trc_rab+rab$w_rsz ; Put record lengthD4 movl out_adr,trc_rab+rab$l_rbf ; Put record address. $put rab=trc_rab ; Put record to trace file rsb D .sbttl close_trace_file routine;++s;D; Functional description:a;TI; This routine close the trace file and release the synchronization lock.r;:; Calling sequence: ;g; call close_trace_file (); ; Input parameters:t;.; None;; Implicit inputs:;a; None; ; Output parameters:;h; None;o; Implicit outputs:l; ; None;u; Completion codes:.;g; Always return SS$_NORMAL;r; Side effects: ;; Close the trace file A; Load lock value block and convert EX synchronization lock to NL; Cancel timer;y;--z .entry close_trace_file, ^m<> close_trace: clrb is_open ; File not open ;+  ; Close the trace file ;-b $disconnect - rab=trc_rab  $close fab=trc_fab ;+e" ; Load LVB and convert lock to NL ;-* movl pid,vbl_pid ; Load new value block movl imgcnt,vbl_img $enqw_s lkmode=#lck$k_nlmode,-l lksb=lksb,-g0 flags=#lck$m_system!lck$m_valblk!lck$m_convert ;+4 ; Cancel five second timer  ;-n $cantim_s - reqidt = #ff_reqidt ! movzwl #ss$_normal,r0 ; Say oke ret e .sbttl write_trace_file routine;++;o; Functional description:a; D; This routine provide the way to edit one message and/or one statusE; longword. It can be used to signal problems in services completion.b ; Here is one example in BASIC :;D#; STAT = SYS$QIOW (... ,IOSB, ...)c; IF (STAT AND 1%) = 0%; THENs4; CALL WRITE_TRACE_FILE ("R0 error in $QIOW",STAT) ; END IFc; IF (IOSB AND 1%) = 0%; THENo#; MESSAGE = "IOSB error in $QIOW"D); CALL WRITE_TRACE_FILE (MESSAGE, STAT)l ; END IF;o>; Unless currently opened, trace file will be open and closed.;; Calling sequence:r;t,; call write_trace_file ([message][,status]); ; Input parameters:u;r ; Message : the message to write; VMS usage : none 4; Type : string (fixed, dynamic or varying of char); Access : read only ; Mechanism : by descriptor;0,; Status : the status to translate and write; VMS usage : cond_value-; Type : longword (unsigned)t; Access : read only ; Mechanism : by referencee;m; Implicit inputs:;.; None;_; Output parameters:;l; None;d; Implicit outputs:g;a; None;"; Completion codes:r;u; Always return SS$_NORMAL;u; Side effects:w; ; Can open/close the trace file%; Write the message to the trace file:;; Write the translation of the error code to the trace fileF;;--_$ .entry write_trace_file_var, ^m> brb write_trace_file_common ; Compatible with pascal modules .entry write_trace_file, ^mwrite_trace_file_common: ;+i ; Open the trace file ;-d* movb is_open,was_opened ; save open flag$ bneq 1$ ; skip if already opened calls #0,g^open_trace_file_ ;+_ ; Edit first parameter_ ;-e)1$: tstl 4(ap) ; First param defined ?m beql 10$ ; No ) movl 4(ap),r0 ; Point to message desc.0 cmpb 3(r0),#dsc$k_class_vs ; Varying of char ? beql 3$ ; YesR1 movw (r0),trc_rab+rab$w_rsz ; Put record length23 movl 4(r0),trc_rab+rab$l_rbf ; Put record addressi brb 5$m*3$: movl 4(r0),r0 ; Point varing of char1 movw (r0),trc_rab+rab$w_rsz ; Put record lengtht4 moval 2(r0),trc_rab+rab$l_rbf ; Put record address15$: $put rab=trc_rab ; Put record to trace fileP* tstb trace_on_screen ; Also on screen ? beql 10$ ; Nob pushl 4(ap) ; Message @ 4 calls #1,g^output_to_output ; output to sys$output ;+s ; Edit second parameter ;- '10$: cmpl (ap),#1 ; One param only ?s bleq 20$ ; Yes, skip' tstl 8(ap) ; Second param defined ?n beql 20$ ; No"* movl @8(ap),r2 ; Status equal to zero ? beql 20$ ; Yes pushl #0 ; OutadrS pushl #15 ; Flags  pushal err_dsc ; Bufadr  pushal err_out_dsc ; Msglen pushl r2 ; Err code , calls #5,g^sys$getmsg ; Get error message% pushal err_out_dsc ; Error message" pushl r2 ; Error codem pushal fao_dsc ; Bufadra pushal out_dsc ; Msglenm pushal status_mes ; Message( calls #5,g^sys$fao ; Convert in ascii3 movw out_dsc,trc_rab+rab$w_rsz ; Put record length5 moval fao_mes,trc_rab+rab$l_rbf ; Put record address5. $put rab=trc_rab ; Put record to trace file* tstb trace_on_screen ; Also on screen ? beql 20$ ; No# pushal out_dsc ; Message @4 calls #1,g^output_to_output ; output to sys$output ;+a ; Close trace file- ;-k720$: tstb was_opened ; trace file previously opened ?e bneq 21$ ; yes, skip close calls #0,g^close_trace_file%21$: movzwl #ss$_normal,r0 ; Say ok ret " .sbttl trace_error routine ;++ ; ; Functional description:l; F; This routine provide the way to edit a complete error message to theF; trace file. User can substitute LIB$SIGNAL by TRACE_ERROR. ParameterF; specification is the same as LIB$SIGNAL/STOP. Here is one example in ; BASIC :l;w.; CALL TRACE_ERROR (REM$_BADVALUE BY VALUE, &; 1% BY VALUE, &c; PHONE_NUMBER BY DESC);i>; Unless currently opened, trace file will be open and closed.;L; Calling sequence::;.7; call trace_error (status [,arg_count [,FAO_arg ...]])i;"; Input parameters:I;a/; Status : the condition code causing the error; VMS usage : cond_valueg; Type : longword (unsigned) ; Access : read only!; Mechanism : by valueT;n.; Arg_count : count of following FAO arguments; VMS usage : nonef; Type : longword (signed)s; Access : read only ; Mechanism : by value.;i<; FAO_arg : FAO arguments associated with the condition code; VMS usage : varying_arg; Type : unspecified ; Access : read onlyi; Mechanism : by value.;i; Implicit inputs:;n; None;d; Output parameters:;:; None;"; Implicit outputs:!; ; None; ; Completion codes:s; ; Always return SS$_NORMAL;z; Side effects:;f?; Write the translation of the condition code to the trace filei;!;-- .entry trace_error, ^m<>m ;+s ; Open the trace file ;-u* movb is_open,was_opened ; save open flag$ bneq 1$ ; skip if already opened calls #0,g^open_trace_filet ;+b ; Write message ;-f 1$: pushl ap< calls #1,g^putmsg_to_trace_file ; edit signal on trace file ;+A ; Close trace filen ;-720$: tstb was_opened ; trace file previously opened ?A bneq 21$ ; yes, skip close calls #0,g^close_trace_file%21$: movzwl #ss$_normal,r0 ; Say okn ret X" .sbttl trace_error_vector routine;++ ;d; Functional description:t;LE; This routine provide the way to edit a complete error vector to theI; trace file. Can be used to signal (for example) RDB error vector. Here ; is one example in BASIC : ;r2; CALL TRACE_ERROR_VECTOR (RDB$MSG_VECTOR BY REF);g>; Unless currently opened, trace file will be open and closed.;e; Calling sequence:i;n*; call trace_error_vector (message_vector);; Input parameters:r;E ; Message_vector : argument list; VMS usage : varying_arg; Type : unspecified; Access : read onlyd,; Mechanism : by reference, array reference;$; Implicit inputs:;r; None;; Output parameters:;.; None;n; Implicit outputs: ; ; None;o; Completion codes:d; ; Always return SS$_NORMAL;E; Side effects:d;n?; Write the translation of the message vector to the trace file;e;--( .entry trace_error_vector, ^m<> ;+i ; Open the trace file ;-n* movb is_open,was_opened ; save open flag$ bneq 1$ ; skip if already opened calls #0,g^open_trace_file: ;+l ; Write vector  ;- 1$: pushl 4(ap)a< calls #1,g^putmsg_to_trace_file ; edit signal on trace file ;+  ; Close trace filea ;-:720$: tstb was_opened ; trace file previously opened ?  bneq 21$ ; yes, skip close calls #0,g^close_trace_file%21$: movzwl #ss$_normal,r0 ; Say ok ret i# .sbttl crash_in_trace_file routinep;++ ; ; Functional description:I; B; This routine provide the way to force the current image to crash!; with a traceback in trace file.o;O; Calling sequence:C;L; call crash_in_trace_file ()g;l; Input parameters:i;i; None;D; Implicit inputs:;t; None;:; Output parameters:;c; None;$; Implicit outputs:o;e; None;m; Completion codes:h;a; None;t; Side effects:n;-; Crash the current image. No return expectedn;n;--i! .entry crash_in_trace_file, ^m<>i ;+e ; Setup condition handler ;-a8 movab condition_handler,(fp) ; Setup condition handler ;+ ; Crash process ;-n. tstl #trace__crash ; defined at link time ? beql 1$ ; no, substitute pushl #trace__crash calls #1,g^lib$stop 41$: pushl #ss$_forcedexit ; use forcedexit instead calls #1,g^lib$stop r ret ; no needs but ...t ' .sbttl forced_close_trace_file routinen;++h;l; Functional description:C; H; This routine force the trace file to be closed. Invoqued as completion<; AST of a timer. Write a warning message to the trace file.;i; Calling sequence:=;l!; call forced_close_trace_file ()i;e; Input parameters:;;a; None;; Implicit inputs:;; None; ; Output parameters:;e; None;s; Implicit outputs:c;^; None;m; Completion codes:b;r; Always return SS$_NORMAL;n; Side effects:s; +; Write a warning message to the trace file_; Call close_trace_fileo;a;--% .entry forced_close_trace_file, ^m<>p ;+  ; Write warning message ;-o pushl #0p pushal fao_dsc ; Bufadrt pushal out_dsc ; Msglen pushal end_time_mes ; Message( calls #4,g^sys$fao ; Convert in ascii bsbw write_mes ; Edit message* tstb trace_on_screen ; Also on screen ? beql 10$ ; Non pushal out_dsc ; Message @4 calls #1,g^output_to_output ; output to sys$output ;+# ; Close the trace file# ;-c 10$: calls #0,g^close_trace_file! movzwl #ss$_normal,r0 ; Say ok_ ret i! .sbttl condition_handler routinea;++e;r; Functional description:l;OF; This routine write a symbolic image traceback to the trace file. VMSI; calls it as condition handler. As documented in "VMS internals and datahI; structures, version 5", (nammed IDS5),page 5-10, it will be called with;F; 2 arguments. The first point the signal array, the second point the; mechanism array as follow :o;l#; +-----------------------+-------+b; | | 2 | <--- APi#; +-----------------------+-------+ (; | Address of signal array +-------+%; +-------------------------------+ | (; | Address of mechanism array +---+ |); +-----------------------+-------+ | |n; | | 4 |<--+ |h%; +-----------------------+-------+ |R#; | FP of establisher frame | |;%; +-------------------------------+ |i; | Depth argument | |c%; +-------------------------------+ |r; | Saved R0 | |%; +-------------------------------+ |s; | Saved R1 | |%; +-----------------------+-------+ |i; | | N |<------+ #; +-----------------------+-------+t!; | Exception or signal name |a#; +-------------------------------+h; | Additional exception |l#; | parameters pushed by hardware |d!; | or additional arguments | !; | passed to LIB$SIGNAL/STOP |t#; +-------------------------------+n; | Exception PC | #; +-------------------------------+h; | Exception PSL |d#; +-------------------------------+s; <--- SP before exceptioni;'; Calling sequence:e;e8; call condition_handler (signal_array, mechanism array);; Input parameters:_;e; Signal_array : ; VMS usage : signal_array ; Type : signal_array; Access : read onlym,; Mechanism : by reference, array reference;; Mechanism array :i; VMS usage : mechanism_array; Type : mechanism_arrayc; Access : read onlyl,; Mechanism : by reference, array reference;e; Implicit inputs:;.; None;a; Output parameters:;e; None;n; Implicit outputs:;i; None; ; Completion codes:n;t.; R0 contains SS$_RESIGNAL if routine returns.; ; Side effects:;v$; Write traceback to the trace file. ; Can open/close the trace file..; Can $EXIT the image (or resignal the error).;d;--b" .entry trace_cond,^m1 brb condition_handler_entry ; For compatibilityi) .entry condition_handler,^mncondition_handler_entry:8 movl chf$l_sigarglst(ap),r2 ; Get signal array address< movl chf$l_mcharglst(ap),r3 ; Get signal mechanism address0 movl chf$l_sig_args(r2),r0 ; @ of count of arg subl2 #2,r0 ; point to PCl0 movl chf$l_sig_name(r2),last_error ; save error. movl chf$l_sig_name(r2)[r0],last_pc ; save pc1 movl chf$l_mch_depth(r3),last_depth ; save depth - movl chf$l_mch_frame(r3),- ; establisher FPo5 in_normal_handler ; zero if called by special code. extzv #sts$v_severity,- ; Get error severity #sts$s_severity,last_error,r0 & cmpl r0,#sts$k_severe ; Severe error blss 10$ ; noC1 tstl last_depth ; Called as exception vector ?e blss 10$ ; yes, skip jsb signal_error_on_screen+"10$: jsb trace_stack ; use r0-r5= calls #0,unload_buffer_to_trace_file ; flush internal buffers1 tstl last_depth ; Called as exception vector ?_ blss 20$ ; yes, resignal! .if not_defined individual_trace. extzv #sts$v_severity,- ; Get error severity #sts$s_severity,last_error,r0k& cmpl r0,#sts$k_severe ; Severe error blss 20$ ; noC= bisl2 #sts$m_inhib_msg,last_error ; Don't edit error message$" pushl last_error ; Final status" calls #1,g^sys$exit ; See you ! .endc020$: movl #ss$_resignal,r0 ; Resignal the error ret s ;+n- ; Signal error with a nice message on screen; ;-signal_error_on_screen:v( tstl #trace__error_detected ; Err code beql 30$ ; If link problems_ pushl #0 ; Outadr pushl #1 ; Flags pushal err_dsc ; Bufadr+ pushal err_out_dsc ; Msglen) pushl #trace__error_detected ; Err codee, calls #5,g^sys$getmsg ; Get error message blbc r0,30$ ; error case( tstw ter_nam_dsc ; Using a terminal ? beql 10$ ; No 6 pushal screen_reset_mes ; Include screen escape seq. pushal screen_mes brb 20$210$: pushal empty_mes ; Default to empty message pushal empty_meso20$: pushal fao_dsc ; Bufadr  pushal out_dsc ; Msglen_% pushal err_out_dsc ; Error messagen( calls #5,g^sys$fao ; Convert in ascii blbc r0,30$ ; error case pushal out_dscp brb 40$ 030$: pushal default_error_message ; use default840$: calls #1,g^output_to_output ; output to sys$output rsb a ;+  ; Do the traceback using FP ;< ; Beginning with the current FP, all frame pointers will beD ; examined one by one. Each time, PC is extracted and compared withB ; specific values. Special case are AST call (PC = SYS$GL_ASTRET)E ; and condition handler (PC = ^x80000014). Otherwise, we assume that#D ; it's a "normal" user PC, and symbolize it if located in P0 space.A ; The call stack frame, described in "VAX Architecture Reference% ; Manual", page 89, look like this :m ;$ ; +-------------------------------+- ; |Condition handler (initially 0)| <---- FPm$ ; +---+-+-+-------+-+---------+---+$ ; |SPA|S|0| Mask |Z|saved PSW| 0 |$ ; +---+-+-+-------+-+---------+---+ ; | Saved AP |u$ ; +-------------------------------+ ; | Saved FP |$ ; +-------------------------------+ ; | Saved PC |u$ ; +-------------------------------+$ ; |Saved R0 (if specified in mask)|$ ; +-------------------------------+$ ; |Saved R1 (if specified in mask)|$ ; +-------------------------------+ ; | . | ; . ; | . |$ ; +-------------------------------+$ ; | Saved R11 (if specified) |$ ; +-------------------------------+% ; Here 0 to 3 bytes specified by SPA  ;> ; If we have found a condition handler call, the signal arrayE ; follow in the call stack. We must so skip 1 long for each registerlE ; saved in mask <0:11>, and skip the number of byte specified in SPAeE ; (Stack Pointer Alignment). After that, we find the signal array of_@ ; the exception. The condition is extracted and edited and the" ; faulting PC is then symbolized. ;? ; For each PC, we try to find the routine entry point. This isaE ; usefull for languages using JSB or GOSUB, because extracted PC can G ; be located in a subroutine without trace in call frame (for example,DF ; if MAIN call A, and A gosub to B, the traceback will only show MAIN@ ; and B, masking A). The routine entry point is find using code@ ; analysis. We look at PC minus few bytes to try to locate some@ ; specific pattern (currently byte, word, long displacement andG ; absolute address). If a match is found, then the entry point addresstE ; is computed and symbolized. Please note that we can give erroneousOF ; results, as the complete instruction is not decoded. Also note that. ; PC manipulation in stack can't be detected. ; ;- trace_stack:: calls #0,g^load_image_structure ; get the image structure .if defined debug_imagesn7 calls #0,g^edit_image_structure ; edit image structure .endc* clrb line_count ; count of edited lines1 tstl last_depth ; Called as exception vector ?i bgeq 2$ ; no, pushal trace_signal_mes ; Signal the trace" calls #1,g^load_message_in_buffer"2$: movl fp,r2 ; point my frame3 tstl in_normal_handler ; called by special code ?n bneq 10$ ; Noe" movl 12(r2),r2 ; Skip my caller ;+0 ; Extract PCr ;-e"10$: movl 16(r2),r3 ; Calling PC( cmpl r3,#system_handler ; In a handler% beql 12$ ; Yes, edit signal arrayt$ cmpl r3,g^sys$gl_astret ; In ast ? beql 11$ ; Yes* decl r3 ; PC -1 point call instruction brw 100$ ; Edit PC B ;+: ; PC is in ASTY ;-W11$: pushl 24(r2) ; param pushal fao_dsc ; Bufadr  pushal out_dsc ; Msglenr$ pushal ast_mes ; ast routine ...( calls #4,g^sys$fao ; Convert in ascii pushal out_dsc$" calls #1,g^load_message_in_buffer brw 160$  ;+E ; PC is in condition handlero ;-,-12$: movl #28,r5 ; Size of "normal" FP + 8l# movl #16,r1 ; First bit to teste&14$: bbc r1,4(r2),16$ ; Bit is clear# addl2 #4,r5 ; One more registers)16$: acbl #27,#1,r1,14$ ; Test next bit * extzv #30,#2,4(r2),r0 ; Stack alignment% addl2 r0,r5 ; Add stack alignmentb addl2 r2,r5 ; Add FP offsets% movl (r5),r5 ; Point signal arraya$ movzbl (r5),r3 ; Count of params* tstb line_count ; any previous errors ? beql 18$ ; nom pushl 4(r5) ; error code pushal fao_dsc ; Bufadrl pushal out_dsc ; Msglenu- pushal header_3_mes ; previous handler ...( calls #4,g^sys$fao ; Convert in ascii pushal out_dscn" calls #1,g^load_message_in_buffer(18$: movl r3,r0 ; # of params to copy! movl sp,r4 ; Remember stack @e&20$: pushl (r5)[r0] ; push parameter sobgtr r0,20$ ; next param* insv #15,#16,#4,r3 ; new message option subl2 #2,r3 ; remove pc/psli pushl r3 ; Parameter count pushl sp ; Vector @r5 calls #1,g^putmsg_to_buffer ; edit signal on bufferl movl r4,sp ; Restore stack @' tstb line_count ; any previous error_ beql 24$ ; noa- pushal header_4_mes ; end of exception ...e" calls #1,g^load_message_in_buffer324$: insv #0,#16,#4,r3 ; clear new message optionk incl r3 ; Point to PCr" movl (r5)[r3],r3 ; Exception PC,100$: tstb line_count ; any previous error bneq 110$ ; yes ! pushal empty_mes ; edit header" calls #1,g^load_message_in_buffer pushal header_1_mes" calls #1,g^load_message_in_buffer pushal header_2_mes" calls #1,g^load_message_in_buffer pushal empty_mesb" calls #1,g^load_message_in_buffer110$: incb line_counto ;+c ; Symbolize PC  ;-N/150$: cmpl r3,#^x3fffffff ; Not in P0 space ?p# bgtru 160$ ; Yes, don't edit it pushl #0 ; Flag PC pushl r3 ; PC to finda( calls #2,g^symbolize_pc ; Symbolize it ;+  ; Find next FP  ;-S+160$: movl 12(r2),r2 ; advance to next FPm beql 170$ ; if don't exist movl 16(r2),r3 ; Calling PC: jsb symbolize_entry_point ; Try to symbolize entry point& brw 10$ ; same player shoots again ;+ ; Unmap DST/DMT ;- 5170$: tstb dst_gst_flag ; previous section opened ?  beql 180$ ; no $deltva_s - ; unmap sectiond inadr=map_adrs clrb dst_gst_flag" tstb dmt_valid ; is DMT valid ? beql 180$ $deltva_s - ; unmap sectionr inadr=map_adr1 clrb dmt_valid$ 180$: rsbe d .sbttl symbolize_entry_pointbsymbolize_entry_point: ;+ ; Try to find entry point ;-t .if defined debug_entries( prober #0,#8,-8(r3) ; Can read code ? beql 10$ ; nos pushl -8(r3) ; return PC - 8 pushl -4(r3) ; return PC - 4 pushal fao_dsc ; Bufadrl pushal out_dsc ; Msglend pushal entries_mes ; Message ( calls #5,g^sys$fao ; Convert in ascii pushal out_dsc_4 calls #1,g^output_to_output ; output to sys$output brb 20$10$: pushl r3 ; return PC pushal fao_dsc ; Bufadr pushal out_dsc ; Msglene# pushal entries_read_mes ; Message ( calls #4,g^sys$fao ; Convert in ascii pushal out_dscC4 calls #1,g^output_to_output ; output to sys$output 20$: .endc-100$: prober #0,#5,-5(r3) ; Can read code ?R beql 120$ ; no* cmpb -5(r3),#^xEF ; Long displacement ? bneq 110$ ; No movl r3,r0n addl2 -4(r3),r0 brb 140$f-110$: cmpb -5(r3),#^x9F ; Absolute address?n bneq 120$ ; No movl -4(r3),r0[ brb 140$[-120$: prober #0,#3,-3(r3) ; Can read code ?  beql 130$ ; no* cmpb -3(r3),#^xCF ; Word displacement ? bneq 130$ ; No movl r3,r0i cvtwl -2(r3),r1 addl2 r1,r0 brb 140$m-130$: prober #0,#2,-2(r3) ; Can read code ?g beql 150$ ; no* cmpb -2(r3),#^xAF ; Byte displacement ? bneq 150$ ; No movl r3,r0a cvtbl -1(r3),r1 addl2 r1,r0 ;+r ; Symbolize entry point ;-d140$: incl r0 ; pc + 1v .if defined debug_entries pushl r0 ; save r0 pushl r0 ; entry point pushal fao_dsc ; Bufadr pushal out_dsc ; Msglenm pushal entry_pc_mes ; Message( calls #4,g^sys$fao ; Convert in ascii pushal out_dsca4 calls #1,g^output_to_output ; output to sys$output popl r0 ; restore r0 .endc* cPK~ TRACE.BCKo"[FF.DCL.TRACE]TRACE_ROUTINES.MAR;1NM(tmpl r0,#^x3fffffff ; Not in P0 space ?# bgtru 150$ ; Yes, don't edit it  pushl #1 ; Flag entry pointa" pushl r0 ; Entry point address( calls #2,g^symbolize_pc ; Symbolize it 150$: rsbl $ .sbttl load_image_structure routine;++;l; Functional description:e;eI; This routine will load the internal image list using image informations_F; setup by the image activator. This is documented in IDS5, page 26-6.H; IAC$GL_IMAGE_LIST is the starting point of a doubly linked list, witchG; contains the Image Control Block of all images currently active. WhensE; informations are extracted from ICB, image header is mapped to find I; DST/GST/DMT starting VBN and size. Image header is documented in IDS5, 5; page 26-5. Routine exits when all images are found.L;R; Calling sequence:$;_; call load_image_structure ();t; Input parameters: ;l; None;d; Implicit inputs:; ; Read ICB; Read images' headerv;o; Output parameters:; ; None;e; Implicit outputs:_;t; Internal image list is loaded:;r; Completion codes:n;c; Always return SS$_NORMAL;; Side effects: ;e ; Allocate memory for image list;t;--t5 .entry load_image_structure,^m ;+l ; Init image list ;-e moval image_queue,image_queue moval image_queue,image_queue+4 ;+f ; Count number of active images ;-t clrl r26 moval @#iac$gl_image_list,r6 ; fixup vectors queue @,1$: movl (r6),r6 ; get first fixup vector cmpl r6,#iac$gl_image_listn beql 2$ ; end of list  incl r2 brb 1$e2$: tstl image_dyn_mem beql 22$l. $deltva_s - ; unmap previous allocated mem inadr=image_dyn_mem t22$: ;+e! ; Allocate memory for all images  ;-C8 mull2 #img_k_structure_len,r2 ; count * structure size addl2 #511,r2 ; for rounding! divl2 #512,r2 ; size in pagesl pushl #0e pushl #0w( pushal image_dyn_mem ; return address pushl r2 ; page counto* calls #4,g^sys$expreg ; allocate memory blbs r0,3$s&100$: movzwl #ss$_normal,r0 ; Say ok ret3$: ;+ ; Read image list ;- ( movl image_dyn_mem,r7 ; first memory @6 moval @#iac$gl_image_list,r6 ; fixup vectors queue @ clrl r8 ; image countc ;+t ; Load infos from ICB ;-p,4$: movl (r6),r6 ; get first fixup vector cmpl r6,#iac$gl_image_listi beql 100$ ; end of list 5 movl icb$l_starting_address(r6),- ; starting addressn img_l_image_begin(r7)./ movl icb$l_end_address(r6),- ; ending addressc img_l_image_end(r7)! movw icb$w_chan(r6),- ; channelt img_w_channel(r7)) movw r8,img_w_image_number(r7) ; image #_0 movc3 #img_s_image_name,- ; count + image name icb$t_image_name(r6),- img_t_image_name(r7)+ clrl img_l_dst_vbn(r7) ; DST starting VBN $ clrw img_l_dst_size(r7) ; and size+ clrl img_l_gst_vbn(r7) ; GST starting VBNt$ clrw img_l_gst_size(r7) ; and size+ clrl img_l_dmt_vbn(r7) ; DMT starting VBNh$ clrl img_l_dmt_size(r7) ; and size ;+ ; Find DST/GST/DMT VBN and size ;-r* movl #200,map_adr ; force mapping in p0 $crmpsc_s - inadr=map_adr,-  retadr=map_adr,- flags=#sec$m_expreg,-  chan=img_w_channel(r7),- pagcnt=#1i blbc r0,5$ ; error casep movl map_adr,r0 ; @ of ihd3 movzwl ihd$w_symdbgoff(r0),r1 ; offset of DST/GSTd) addl2 r1,r0 ; point the DST/GST block , movl ihs$l_dstvbn(r0),- ; DST starting VBN img_l_dst_vbn(r7) ' movzwl ihs$w_dstblks(r0),- ; and sizer img_l_dst_size(r7) l, movl ihs$l_gstvbn(r0),- ; GST starting VBN img_l_gst_vbn(r7) ' movzwl ihs$w_gstrecs(r0),- ; and size; img_l_gst_size(r7) i, movl ihs$l_dmtvbn(r0),- ; DMT starting VBN img_l_dmt_vbn(r7) & movl ihs$l_dmtbytes(r0),- ; and size img_l_dmt_size(r7)  $deltva_s - ; unmap sectiona inadr=map_adrs ;+, ; Insert new element in internal image list ;-t45$: insque img_l_forward(r7),- ; insert it in queue$ @image_queue+4 ; at end of queue6 addl2 #img_k_structure_len,r7 ; Advance usable mem @ incl r8 ; Image countc brw 4$s p$ .sbttl edit_image_structure routine .if defined debug_imagese;++f;.; Functional description:o;aG; This routine edit the internal image structure to the screen (used as"; debugging tool)e;1; Calling sequence:w;;; call edit_image_structure ();h; Input parameters:e;d; None;; Implicit inputs:;l; None;; Output parameters:;-; None;; Implicit outputs:i; ; None;-; Completion codes: ; ; Always return SS$_NORMAL;-; Side effects:-;-"; Output image structure on screen; ;--c# .entry edit_image_structure,^m-$ moval image_queue,r5 ; image list%1$: movl (r5),r5 ; get first image- cmpl r5,image_queue_addra beql 100$ ; end of list-% pushl img_l_dmt_size(r5) ; DMT sizep# pushl img_l_dmt_vbn(r5) ; DMT vbn-% pushl img_l_gst_size(r5) ; GST size|# pushl img_l_gst_vbn(r5) ; GST vbn-% pushl img_l_dst_size(r5) ; DST size-# pushl img_l_dst_vbn(r5) ; DST vbn * movzwl img_w_channel(r5),-(sp) ; channel, pushl img_l_image_end(r5) ; ending address0 pushl img_l_image_begin(r5) ; starting address2 pushal img_t_image_name(r5) ; count + image name pushal fao_dsc ; Bufadr  pushal out_dsc ; Msglen " pushal image_info_mes ; Message) calls #13,g^sys$fao ; Convert in ascii  pushal out_dsc-4 calls #1,g^output_to_output ; output to sys$output brb 1$-100$: movzwl #ss$_normal,r0< ret .endc e .sbttl symbolize_pc routine;++;a; Functional description:l;rD; PC symbolization is made using the following steps. First, we walkA; trought the internal image list to find the image containing PC G; (looking at starting/ending address fields). When the image is found, H; we detect two special cases (LIB$INITIALIZE and it's coroutine). If PCH; is not at these locations, we read DST or GST to find the best routine?; name for PC. At end, the result is loaded in internal buffer.;; Calling sequence:;%; call symbolize_pc (pc_value, flags) ;c; Input parameters:i;o ; PC_value : the PC to symbolize; VMS usage : noneb; Type : longword (unsigned)p; Access : read only.; Mechanism : by referencee;n;; Flags : non zero value indicate entry point symbolization>; VMS usage : nonel; Type : longword (unsigned); Access : read onlyd; Mechanism : by valued;o; Implicit inputs:; ; Read internal image list;i; Output parameters:; ; None;g; Implicit outputs:n;m; None;d; Completion codes:_;s; Always return SS$_NORMAL;s; Side effects:o; *; Write PC symbolization to the trace file>; Call READ_DST and READ_GST (witch can cause DST/GST mapping); ;--_* .entry symbolize_pc,^m ;+_ ; Init local variablesi ;-F4 movc5 #0,symbolize_beg,#0,- ; clear symbolize zone #symbolize_len,symbolize_beg$ movl #1,increment ; used by linum" movl 4(ap),r6 ; pc to symbolize# movl r6,pc_to_symbolize ; save it;$ moval image_queue,r7 ; image list ;+v) ; Find the image corresponding to the PCg ;-r&10$: movl (r7),r7 ; get first image cmpl r7,image_queue_addro bneq 12$ ; end of list brw 40$/12$: cmpl r6,img_l_image_begin(r7) ; in range ?p blssu 10$ ; no. cmpl r6,img_l_image_end(r7) ; ending address bgtru 10$3 movc3 #40,img_t_image_name(r7),- ; save image name image_name0 tstw img_w_image_number(r7) ; on first image ? beql 20$ ; yes+ subl2 img_l_image_begin(r7),r6 ; "base" pcn ;+  ; Init routine case ;-_,20$: cmpl r6,lib_init_addr ; init routine ? bneq 22$ ; noc# moval lib_init_call_mes,r0 ; namei! movzbl (r0),r1 ; size of nameS incl r1 ; also copy size3 movc3 r1,(r0),routine_name ; copy name to routinet brb 40$ _ ;+d ; Init coroutine case ;-I322$: cmpl r6,lib_init_coroutine ; init coroutine ?  bneq 24$ ; no ' moval lib_init_coroutine_mes,r0 ; name ! movzbl (r0),r1 ; size of namet incl r1 ; also copy size3 movc3 r1,(r0),routine_name ; copy name to routine brb 40$  ;+ ; Read DST  ;-n,24$: tstl img_l_dst_size(r7) ; have a dst ? beql 30$m pushl r7d pushl r6c! calls #2,g^read_dst ; read dst2& tstb routine_name ; routine found ? bneq 40$ ; yes  ;+_ ; Read GSTp ;- ,30$: tstl img_l_gst_size(r7) ; have a gst ? beql 40$a pushl r7s pushl r6 ! calls #2,g^read_gst ; read gsto ;+n ; Format line number  ;-o!40$: moval empty_mes,line_address moval empty_mes,stmt_addresse& tstl best_line_number ; line found ? beql 50$t movw #5,line_number_mes pushl best_line_number " pushal line_number_mes ; Bufadr" pushal line_number_mes ; Msglen pushal line_mes ; Message( calls #4,g^sys$fao ; Convert in ascii# moval line_number_mes,line_addressa ;+a ; Format statement number ;-6 cmpl #1,best_stmt_number ; statement number defined? beql 50$ ; edit if not 1 movw #3,stmt_number_mes pushl best_stmt_numberc" pushal stmt_number_mes ; Bufadr" pushal stmt_number_mes ; Msglen pushal stmt_mes ; Message( calls #4,g^sys$fao ; Convert in ascii# moval stmt_number_mes,stmt_addressi ;+|/ ; Write one entry point line to the trace file ;-P-50$: tstb 8(ap) ; Called for entry point ?- beql 55$ ; no+E cmpl best_routine,last_best_routine ; Entry and PC in same routine ? * beql 51$ ; Yes, don't edit entry point# pushl pc_to_symbolize ; PC value++ subl3 best_routine,r6,-(sp) ; relative PC0( pushl stmt_address ; statement number# pushl line_address ; line numberf pushal routine_name ; routine" pushal entry_point_mes ; module pushal fao_dsc ; Bufadr- pushal out_dsc ; Msglen pushal pc_mes ; Messagee( calls #9,g^sys$fao ; Convert in ascii pushal out_dsc3" calls #1,g^load_message_in_buffer 51$: brw 80$ ;+t# ; Use image name as module default; ;-o*55$: tstl best_routine ; routine found ? bneq 60$ ; yes. movl img_l_image_begin(r7),- ; base of image best_routine + movl pc_to_symbolize,r6 ; pc to symbolizet# moval image_name,r0 ; image namee' movzbl (r0),r1 ; size of image namen incl r1 ; also copy size- movc3 r1,(r0),module_name ; copy image namet ;+i! ; Split line if long module namea ;-u060$: cmpb module_name,#15 ; Long module name ? bleq 65$ ; no; pushal module_name ; module pushal fao_dsc ; Bufadre pushal out_dsc ; Msglena pushal pc_mes1 ; Message( calls #4,g^sys$fao ; Convert in ascii pushal out_dscr" calls #1,g^load_message_in_buffer. clrb module_name ; reset module name length ;+e& ; Write one PC line to the trace file ;-l>65$: movl best_routine,last_best_routine ; Save last routine @# pushl pc_to_symbolize ; PC value + subl3 best_routine,r6,-(sp) ; relative PCc( pushl stmt_address ; statement number# pushl line_address ; line numbero pushal routine_name ; routine pushal module_name ; module pushal fao_dsc ; Bufadr, pushal out_dsc ; Msglent pushal pc_mes ; Messagen( calls #9,g^sys$fao ; Convert in ascii pushal out_dscm" calls #1,g^load_message_in_buffer ;+; ; Write block names ;-t$ tstb block_name ; found a block ? beql 70$ ; no$# pushl pc_to_symbolize ; PC value ) subl3 best_block,r6,-(sp) ; relative PCe& pushal empty_mes ; statement number! pushal empty_mes ; line number; pushal block_name ; routine! pushal block_name_mes ; module  pushal fao_dsc ; Bufadrt pushal out_dsc ; Msglenr pushal pc_mes ; Message3( calls #9,g^sys$fao ; Convert in ascii pushal out_dscs" calls #1,g^load_message_in_buffer ;+n ; Write label name; ;-(70$: tstb label_name ; found a label ? beql 80$ ; noi# pushl pc_to_symbolize ; PC valueW) subl3 best_label,r6,-(sp) ; relative PC_& pushal empty_mes ; statement number! pushal empty_mes ; line numberu pushal label_name ; routine! pushal label_name_mes ; module$ pushal fao_dsc ; Bufadr_ pushal out_dsc ; Msglen; pushal pc_mes ; Message( calls #9,g^sys$fao ; Convert in ascii pushal out_dsc " calls #1,g^load_message_in_buffer80$: movzwl #ss$_normal,r0 ret d .sbttl read_dst routine;++;:6; Functional description:t;xG; This routine will return the best routine, label, module, block, lined=; and statement number symbolization for a given PC using DST)F; informations. To avoid complete DST scanning, we fisrt try to locateF; the module in the DMT (Debug Module Table). DMT is documented in VMS=; microfiches, in module TBKDST.BLI. A DMT look's like this :u;s#; +-------------------------------+ "; | DST @ of module DST record |#; +-------------------------------+a ; | Size of module's DST |#; +---------------+---------------+#; | 0 | Psect count |#; +---------------+---------------+:"; | @ of first psect in module |#; +-------------------------------+ ; | Length of first psect |#; +-------------------------------+ ; | . | ; .m ; | . |#; +-------------------------------+^!; | @ of last psect in module |b#; +-------------------------------+a; | Length of last psect |e#; +-------------------------------+s; G; If the psect containing the PC is found, then DST scanning is limitedrG; to the concerned module (else full DST scanning will occurs). At end,o); best values are returned to the caller. ;C; Only module, routine, block, label and line number-pc correlationB; records are used in DST. The general format of a DST record is :;#; ----------------+-------+-------+d#; depends on type | type | length|m#; ----------------+-------+-------+r;p>; For module, routine, block and label record, the format is :;l#; +-------+-------+-------+-------+;#; |@(beg) | flags | type | length| #; +-------+-------+-------+-------+ !; |namelen| @ (last 3 bytes) | #; +-------+-----------------------+s"; name (size given in namelen) |#; --------------------------------+ ; 1; For line number-PC correlation, the format is : ;d#; ----------------+-------+-------+n#; linum commands | type | length|r#; ----------------+-------+-------+ ; &; Each linum command is formatted as :;D#; ------------------------+-------+ #; depends on command |command| #; ------------------------+-------+a;e; Calling sequence:d;+; call read_dst (PC_value, image_structure)s;T; Input parameters:;$ ; PC_value : the PC to symbolize; VMS usage : noner; Type : longword (unsigned); Access : read only_; Mechanism : by referencen;G; Image_structure : internal structure describing image characteristicsp; VMS usage : none;"; Type : internal image structure; Access : read onlyt; Mechanism : by reference;;t; Implicit inputs:;_; Read image DST and DMT;_; Output parameters:; ; None; ; Implicit outputs:#;^; None; ; Completion codes:s; ; Always return SS$_NORMAL;_; Side effects:t;y; Map image DST and DMT:;s;-- 0 .entry read_dst,^m movl 4(ap),r6 ; pcp movl 8(ap),r7 ; img struture  .if defined debug_routinesr pushl r6 pushal fao_dsc ; Bufadr^ pushal out_dsc ; Msglen  pushal pc_requested_mes( calls #4,g^sys$fao ; Convert in ascii pushal out_dsc$4 calls #1,g^output_to_output ; output to sys$output .endc ;+ $ ; Was same DST/DMT already mapped ? ;-1& cmpw dst_gst_index,- ; same index ? img_w_image_number(r7) bneq 10$ ; nor+ cmpb dst_gst_flag,#dst_flag ; good flag ?3 bneq 10$ ; no  tstb dmt_valid ; DMT valid ?3 beql 20$ ; no  brw 30$ ; read DMT410$: tstb dst_gst_flag ; previous section opened ? beql 12$ ; no$ ;+r ; Unmap previous DST/GSTc ;-g $deltva_s - ; unmap sectionr inadr=map_adr  clrb dst_gst_flag" tstb dmt_valid ; is DMT valid ? beql 12$ ; no0 ;+r ; Unmap previous DMTi ;-; $deltva_s - ; unmap section. inadr=map_adr1 clrb dmt_valid  ;+ ; Map DST ;-;.12$: movl #200,map_adr ; force mapping in p0 $crmpsc_s - ; map dsts inadr=map_adr,-; retadr=map_adr,- flags=#sec$m_expreg,-a chan=img_w_channel(r7),- pagcnt=img_l_dst_size(r7),-p vbn=img_l_dst_vbn(r7)0 blbs r0,22$ ; ok casec brw 45$ ;+f ; DST full scan ;-%20$: movl map_adr,r8 ; begin of dstp# movl map_adr+4,r10 ; end of dst l brw 50$ ; let's go/22$: movw img_w_image_number(r7),- ; save index5 dst_gst_indexb) movb #dst_flag,dst_gst_flag ; save flagl' tstl img_l_dmt_vbn(r7) ; Have a DMT ?u( beql 20$ ; no, scan the complete DST ;+e ; Map DMT ;- + movl #200,map_adr1 ; force mapping in p0t7 addl3 #511,img_l_dmt_size(r7),r0 ; dmt size + rounding ! divl2 #512,r0 ; size in pagesh $crmpsc_s - ; map DMTl inadr=map_adr1,- retadr=map_adr1,-e flags=#sec$m_expreg,-t chan=img_w_channel(r7),- pagcnt=r0,-f vbn=img_l_dmt_vbn(r7)i& blbc r0,20$ ; error case, scan all$ mnegb #1,dmt_valid ; DMT is valid ;+l ; Find module in DMTR ;-a&30$: movl map_adr1,r8 ; begin of DMT1 addl3 r8,img_l_dmt_size(r7),r10 ; end of DMT + 1!32$: movl (r8)+,r0 ; DST offsetB" movl (r8)+,r1 ; Module DST size! movl (r8)+,r2 ; count of psectm beql 32$ ; zero psect case ! .if defined,debug_dmt pushr #^mn pushl r2 ; count pushl r1 ; sizee pushl r0 ; offseta pushal fao_dsc ; Bufadr pushal out_dsc ; Msglenr pushal dmt_mes ; Message( calls #6,g^sys$fao ; Convert in ascii pushal out_dsce4 calls #1,g^output_to_output ; output to sys$output popr #^m .endc%34$: movl (r8)+,r3 ; begin of psect_' addl3 (r8)+,r3,r4 ; end of psect + 1l .if defined,debug_dmt pushr #^m decl r4 ; psect end  pushl -4(r8) ; sizec pushl r4 ; end pushl r3 ; begin pushal fao_dsc ; Bufadr  pushal out_dsc ; Msglen pushal psect_mes ; Message:( calls #6,g^sys$fao ; Convert in ascii pushal out_dsc_4 calls #1,g^output_to_output ; output to sys$output popr #^mi .endc cmpl r6,r3 ; PC in range ? blssu 36$ ; too lowp cmpl r6,r4 ; PC in range bgtru 36$ ; to highp, addl3 map_adr,r0,r8 ; begin of DST module& addl3 r8,r1,r10 ; end of DST module brb 50$  "36$: sobgtr r2,34$ ; next psect cmpl r8,r10 ; end of DMT ? bgequ 38$ ; yes@ brw 32$ ; next DMT record 38$: brw 20$40$: bsbw load_valuesm45$: movzwl #ss$_normal,r0 ret ;+B ; Find PC in DST6 ;- "50$: cmpl r8,r10 ; end of DST ? bgeq 40$ ; yes movzbl (r8)+,r9 ; sizes .if defined debug_dst moval not_def_mes,r0  cmpl r9,#6 ; string defined. bleq 52$ ; nod moval 6(r8),r0d52$: pushl r0 ; string @n clrl r0 cmpl r9,#2 ; long definedt bleq 54$ ; no7 movl 2(r8),r054$: pushl r0 ; longg clrl r0 cmpl r9,#1 ; byte defined  bleq 56$ ; no$ movzbl 1(r8),r056$: pushl r0 ; byte pushl r9 ; size7 movzbl (r8),-(sp) ; type  pushal fao_dsc ; Bufadre pushal out_dsc ; MsglenG pushal dst_mes ; Message( calls #8,g^sys$fao ; Convert in ascii pushal out_dsca4 calls #1,g^output_to_output ; output to sys$output .endc ;+/ ; Select DST record ;- caseb (r8),#^xaf,#16f01000$: .word 100$-1000$ ; out of range (<= af)( .word 1010$-1000$ ; dst$k_blkbeg = b0' .word 100$-1000$ ; dst$k_blkend = b1c' .word 100$-1000$ ; dst$k_prolog = b2v' .word 100$-1000$ ; unknown code = b3_' .word 100$-1000$ ; unknown code = b4a' .word 1050$-1000$ ; dst$k_entry = b5' .word 100$-1000$ ; unknown code = b6V' .word 100$-1000$ ; unknown code = b7s& .word 100$-1000$ ; dst$k_psect = b8* .word 1020$-1000$ ; dst$k_line_num = b9) .word 100$-1000$ ; dst$k_lblorlit = bah' .word 1030$-1000$ ; dst$k_label = bbs( .word 1040$-1000$ ; dst$k_modbeg = bc' .word 100$-1000$ ; dst$k_modend = bdm( .word 1050$-1000$ ; dst$k_rtnbeg = be' .word 100$-1000$ ; dst$k_rtnend = bfn" brw 100$ ; out of range (> bf) ;+I ; It's a block DST record ;-g11010$: movl r8,block_dst_addr ; save block dst @e" movl 2(r8),r5 ; get block begin .if defined debug_blocks_ pushl r5_ addl3 block_dst_addr,#6,-(sp) pushal fao_dsc ; Bufadrb pushal out_dsc ; Msglene pushal block_mes( calls #5,g^sys$fao ; Convert in ascii pushal out_dscp4 calls #1,g^output_to_output ; output to sys$output .endc! cmpl r6,r5 ; test if in rangeo blssu 1014$ ; too lowe* cmpl r5,best_block ; better than best ? blssu 1014$ ; no# movl r5,best_block ; is the bestl( movl block_dst_addr,best_block_dst_addr1014$: brw 100$t ;+s ; It's a line number DST record ;- 1020$: bsbw read_linum_mes brw 100$  ;+f ; It's a label DST record ;-u11030$: movl r8,label_dst_addr ; save label dst @u" movl 2(r8),r5 ; get label begin .if defined debug_labels5 pushl r5i addl3 label_dst_addr,#6,-(sp) pushal fao_dsc ; Bufadrf pushal out_dsc ; Msglen( pushal label_mesp( calls #5,g^sys$fao ; Convert in ascii pushal out_dsc54 calls #1,g^output_to_output ; output to sys$output .endc! cmpl r6,r5 ; test if in rangel blssu 1034$ ; too lowb* cmpl r5,best_label ; better than best ? blssu 1034$ ; no# movl r5,best_label ; is the bestg( movl label_dst_addr,best_label_dst_addr1034$: brw 100$a ;+  ; It's a module DST record  ;-s 1040$: .if defined debug_modules pushal 6(r8)s pushal fao_dsc ; Bufadre pushal out_dsc ; Msglenn pushal module_mes ; Message( calls #4,g^sys$fao ; Convert in ascii pushal out_dscb4 calls #1,g^output_to_output ; output to sys$output .endc$ movl r8,module_dst_addr ; @ in dst movl #^x7fffffff,module_begin clrl pc_linei clrl line_numberl movl #1,stmt_number brb 100$r ;+h ; It's a routine DST record ;-m51050$: movl r8,routine_dst_addr ; save routine dst @s$ movl 2(r8),r5 ; get routine begin .if defined debug_routinesL pushl r5Z addl3 routine_dst_addr,#6,-(sp) pushal fao_dsc ; Bufadre pushal out_dsc ; Msglent pushal routine_mesP( calls #5,g^sys$fao ; Convert in ascii pushal out_dsc 4 calls #1,g^output_to_output ; output to sys$output .endc, cmpl r5,module_begin ; lower than begin ? bgtr 1052$i* movl r5,module_begin ; new module begin'1052$: cmpl r6,r5 ; test if in rangeM blssu 100$ ; too low, cmpl r5,best_routine ; better than best ? blssu 100$ ; no % movl r5,best_routine ; is the best(, movl routine_dst_addr,best_routine_dst_addr* movl module_dst_addr,best_module_dst_addr-100$: addl2 r9,r8 ; advance to next symbolr brw 50$ ; loop ;+c( ; PC/Line number correlation DST record ;-sread_linum_mes:r movl r8,r2 ; point message incl r2 addl3 r8,r9,r3 ; ending @read_next_line:a cmpl r2,r3 ; at end( blssu 1$ ; in rangea rsb1$: .if defined debug_lines_ pushl 1(r2) movzbl (r2),-(sp) pushal fao_dsc ; Bufadr pushal out_dsc ; Msglen - pushal line_num_mes ; previous handler ...i( calls #5,g^sys$fao ; Convert in ascii pushal out_dsc64 calls #1,g^output_to_output ; output to sys$output .endc ;+i ; Select linum record type ;-v caseb (r2)+,#0,#21o10$: .word 1000$-10$ .word 1010$-10$ .word 1020$-10$ .word 1030$-10$ .word 1040$-10$ .word 1050$-10$ .word 1060$-10$ .word 1070$-10$ .word 1080$-10$ .word 1090$-10$ .word 1100$-10$ .word 1110$-10$ .word 1120$-10$ .word 1130$-10$ .word 1140$-10$ .word 1150$-10$ .word 1160$-10$ .word 1170$-10$ .word 1180$-10$ .word 1190$-10$ .word 1200$-10$ .word 1210$-10$1000$: bsbw incr_stmt_line bsbw init_pc" cvtbl -1(r2),r0 subl2 r0,pc_line; brw test_pc1010$: bsbw incr_stmt_line movzwl (r2)+,r0 brw add_to_pc1020$: bsbw incr_stmtm movzbl (r2)+,r0 brw add_to_line1030$: bsbw incr_stmtp movzwl (r2)+,r0 brw add_to_line1040$: movzbl (r2)+,r0 brw load_increment;1050$: movzwl (r2)+,r0 brw load_incrementi1060$: movl #1,r0o brb load_increment 1070$: clrl line_stmt_flag brw set_stmt_1m1080$: movb #1,line_stmt_flagn brw set_stmt_1 1090$: movzwl (r2)+,r0 brb load_line1100$: movzbl (r2)+,r0 addl2 module_begin,r0 brb load_pc1110$: movzwl (r2)+,r0 addl2 module_begin,r0 brb load_pc1120$: movl (r2)+,r0 addl2 module_begin,r0 brb load_pc1130$: movzwl (r2)+,stmt_number? brb test_pc1140$: movzbl (r2)+,r0 brb add_to_pc1150$: movzwl (r2)+,r0 brb add_to_pc1160$: movl (r2)+,r0 brb load_pc1170$: bsbw incr_stmt_line movl (r2)+,r0 brb add_to_pc1180$: bsbw incr_stmtp movl (r2)+,r0 brb add_to_line1190$: movzbl (r2)+,r0 brb load_line1200$: movl (r2)+,r0 brb load_line1210$: movl (r2)+,r0 brb add_to_pc load_line: movl r0,line_number brb next_lineload_increment:l movl r0,increment tstb line_stmt_flag bneq set_stmt_1 brb next_line add_to_line: addl2 r0,line_number set_stmt_1:a movl #1,stmt_number next_line: brw read_next_linesload_pc: movl r0,pc_line brb next_line add_to_pc: bsbw init_pcr addl2 r0,pc_linettest_pc: .if defined debug_lines pushl stmt_number pushl line_number pushl pc_line pushal fao_dsc ; Bufadr# pushal out_dsc ; Msglenc* pushal pc_is_mes ; previous handler ...( calls #6,g^sys$fao ; Convert in ascii pushal out_dscP4 calls #1,g^output_to_output ; output to sys$output .endc cmpl pc_line,r6 ; Compare pct bgtru 1$ ; too highn0 cmpl pc_line,best_pc_line ; better then best ? blssu 1$ ; nop$ tstb line_number ; line defined ? beql 1$ ; no movl pc_line,best_pc_line" movl line_number,best_line_number" movl stmt_number,best_stmt_number1$: brw read_next_lineinit_pc: tstl pc_linen bneq 1$ movl module_begin,pc_line1$: rsbincr _stmt_line:; tstb line_stmt_flag bneq 1$ addl2 increment,line_number rsb1$: addl2 increment,stmt_numberl rsb incr_stmt: tstb line_stmt_flag beql 1$ addl2 increment,stmt_number1$: rsb ;+5 ; Load best values  ;-u load_values:0 tstl best_routine_dst_addr ; routine located ? beql 1$) movl best_routine_dst_addr,r0 ; @ in DSTl) movzbl 6(r0),r1 ; size of routine namem incl r1 ; also copy size) movc3 r1,6(r0),routine_name ; copy name ) movl best_module_dst_addr,r0 ; @ in DSTa( movzbl 6(r0),r1 ; size of module name incl r1 ; also copy size( movc3 r1,6(r0),module_name ; copy name/1$: tstl best_block_dst_addr ; block located ?  beql 2$ ; no6 cmpl best_block,best_routine ; better than routine ? blssu 2$ ; nos( movl best_block_dst_addr,r0 ; @ in DST' movzbl 6(r0),r1 ; size of block namem incl r1 ; also copy size' movc3 r1,6(r0),block_name ; copy namee/2$: tstl best_label_dst_addr ; label located ?: beql 3$6 cmpl best_label,best_routine ; better than routine ? blssu 3$ ; no;( movl best_label_dst_addr,r0 ; @ in DST' movzbl 6(r0),r1 ; size of label namet incl r1 ; also copy size' movc3 r1,6(r0),label_name ; copy namea3$: rsbi  .sbttl read_gst routine;++p;a; Functional description:s; H; This routine locate the best routine value for the given PC. Image GSTD; is scanned. Only GSD records are used. For more information on GSDB; records, see "VMS linker utility manual", chapter 7.3, page 7-7.;oH; As GST are present on shareable images, it likely that the entry pointF; as been "transfered" to keep consistency between two versions of theI; image (as decribed in chapter 4.2.3, page 4-5 of the linker manual). SoaG; we attempt to decode instruction stream to find this transfer vector.sG; If found, we try to compare the destination address with the PC. OnlyvD; transfer vector using JMP, BRW or BRB instructions are recognized.;n; Calling sequence:;;;+; call read_dst (PC_value, image_structure);q; Input parameters:l;_ ; PC_value : the PC to symbolize; VMS usage : none ; Type : longword (unsigned)e; Access : read only; Mechanism : by referencem;uG; Image_structure : internal structure describing image characteristicss; VMS usage : noned"; Type : internal image structure; Access : read onlyg; Mechanism : by referenceo;r; Implicit inputs:;_; Read image GST;d; Output parameters:;:; None;$; Implicit outputs:;b; None;t; Completion codes:;u; Always return SS$_NORMAL;h; Side effects:e;n; Map image GST,;b;--o4 .entry read_gst,^m movl 4(ap),r6 ; pcS movl 8(ap),r11 ; img struture .if defined debug_routinest pushl r6  pushal fao_dsc ; BufadrM pushal out_dsc ; Msglene pushal pc_requested_mes( calls #4,g^sys$fao ; Convert in ascii pushal out_dsc-4 calls #1,g^output_to_output ; output to sys$output .endc ;+- ; Was same GST already mapped ? ;- & cmpw ds t_gst_index,- ; same index ? img_w_image_number(r11)  bneq 1$ ; no+ cmpb dst_gst_flag,#gst_flag ; good flag ?  bneq 1$ ; no brw 8$e ;+- ; Unmap previous DST/GST- ;-31$: tstb dst_gst_flag ; previous section opened ?- beql 2$ ; no $deltva_s - ; unmap section- inadr=map_adr- clrb dst_gst_flag ;+s ; Unmap previous DMT  ;--" tstb dmt_valid ; is DMT valid ? beql 2$ ; no $deltva_s - ; unmap section- inadr=map_adr1 clrb dmt_validn ;+ ; Map GST ;- -2$: movl #200,map_adr ; force mapping in p0d $crmpsc_s - ; map dsti inadr=map_adr,-o retadr=map_adr,- flags=#sec$m_expreg,- chan=img_w_channel(r11),-l vbn=img_l_gst_vbn(r11) blbs r0,8$ ; ok case brb 5$i34$: tstl best_routine_dst_addr ; routine located ?- beql 5$) movl best_routine_dst_addr,r0 ; @ in DST ) movzbl (r0),r1 ; size of routine name- incl r1 ; also copy size( movc3 r1,(r0),routine_name ; copy name# moval image_name,r0 ; image name-' movzbl (r0),r1 ; size of image namee incl r1 ; also copy size- movc3 r1,(r0),module_name ; copy image name 5$: movzwl #ss$_normal,r0- ret ;+  ; GST full scan ;-a/8$: movw img_w_image_number(r11),- ; save index  dst_gst_indexe) movb #gst_flag,dst_gst_flag ; save flag-! movl map_adr,r8 ; begin of gst / movl img_l_gst_size(r11),r4 ; count of record-10$: blbc r8,11$ incl r811$: movzwl (r8)+,r9 ; sizes .if defined debug_gst pushl r9 ; size  movzbl 1(r8),-(sp) ; subtype  movzbl (r8),-(sp) ; type- pushal fao_dsc ; Bufadrn pushal out_dsc ; Msglen_ pushal gst_mes ; Message( calls #6,g^sys$fao ; Convert in ascii pushal out_dsc4 calls #1,g^output_to_output ; output to sys$output .endc& cmpb (r8),#obj$c_gsd ; GSD record ? bneq 100$ ; no, skip itn bsbb gsd_record-100$: addl2 r9,r8 ; advance to next symboln+ sobgtr r4,110$ ; decrement record countA brw 4$ ; end of GSTc110$: brw 10$ ; loop gsd_record:t! movl r8,r7 ; point gsd record_$ addl3 r8,r9,r10 ; end of record @next_gsd_record: incl r7 ; point next element cmpl r7,r10 ; at end ? blssu 12$ ; no rsb ;+t ; Select GSD record ;-M(12$: caseb (r7),#gsd$c_psc-1,#gsd$c_prom20$: .word unk_gsd-20$ .word gsd_psc-20$ .word gsd_sym-20$ .word gsd_epm-20$ .word gsd_pro-20$ .word gsd_symw-20$ .word gsd_epmw-20$; .word gsd_prow-20$_ .word gsd_idc-20$ .word gsd_env-20$ .word gsd_lsy-20$ .wordj~ TRACE.BCKo"[FF.DCL.TRACE]TRACE_ROUTINES.MAR;1Nr4 gsd_lepm-20$c .word gsd_lpro-20$ .word gsd_spsc-20$_ .word gsd_symv-20$y .word gsd_epmv-20$; .word gsd_prov-20$M .word gsd_symm-20$; .word gsd_epmm-20$e .word gsd_prom-20$unk_gsd: rsb ; unknown record typegsd_psc:% movl #gps$b_namlng,r2 ; name offsetb brw next_gsd gsd_sym:5 extzv #gsy$v_def,#1,gsy$w_flags(r7),r0; definition ?  bneq 1$ movl #srf$b_namlng,r2 brw next_gsd ,1$: movl #sdf$b_namlng,r2 ; and name offset brw next_gsd gsd_epm:& movl #epm$l_addrs,r1 ; value offset) movl #epm$b_namlng,r2 ; name len offsett$ brw read_gsd_symbol ; read symbolgsd_pro:& movl #pro$l_addrs,r1 ; value offset) movl #pro$b_namlng,r2 ; name len offsetagsd_pro_common:_$ bsbw get_gsd_symbol ; read symbol- movzbl fml$b_maxargs(r7),r1 ; max arg countr+ addl2 #fml$b_maxargs,r7 ; point fisrt arg  tstl r1 ; arg count= bleq 2$ ; no moren41$: addl2 arg$b_bytecnt(r7),r7 ; argument name size& addl2 #arg$b_bytecnt,r7 ; and offset sobgtr r1,1$ ; next argf2$: brw next_gsd_record gsd_symw:_ movl #sdfw$b_namlng,r2 brw next_gsd, gsd_epmw:f& movl #epmw$l_addrs,r1 ; value offset* movl #epmw$b_namlng,r2 ; name len offset$ brw read_gsd_symbol ; read symbol gsd_prow:a& movl #prow$l_addrs,r1 ; value offset* movl #prow$b_namlng,r2 ; name len offset brw gsd_pro_common;gsd_idc: movl #idc$b_namlng,r2$ movzbl (r7)[r2],r0 ; get name len addl2 r2,r7 ; add name len addl2 r0,r7 ; and offset" movzbl (r7)+,r0 ; get ident len! addl2 r0,r7 ; skip over ident# movzbl (r7)+,r0 ; get object lene" addl2 r0,r7 ; skip over object brw next_gsd_recordgsd_env: movl #env$b_namlng,r2 brw next_gsdegsd_lsy:5 extzv #gsy$v_def,#1,gsy$w_flags(r7),r0; definition ?  bneq 1$ movl #lsrf$b_namlng,r2_ brw next_gsdi1$: movl #lsdf$b_namlng,r2 brw next_gsde gsd_lepm:& movl #lepm$l_addrs,r1 ; value offset* movl #lepm$b_namlng,r2 ; name len offset$ brw read_gsd_symbol ; read symbol gsd_lpro:c& movl #lpro$l_addrs,r1 ; value offset* movl #lpro$b_namlng,r2 ; name len offset brw gsd_pro_commonl gsd_spsc:e movl #sgps$b_namlng,r2B brw next_gsd gsd_symv:M movl #sdfv$b_namlng,r2 brw next_gsdl gsd_epmv:a& movl #epmv$l_addrs,r1 ; value offset* movl #epmv$b_namlng,r2 ; name len offset$ brw read_gsd_symbol ; read symbol gsd_prov:r& movl #prov$l_addrs,r1 ; value offset* movl #prov$b_namlng,r2 ; name len offset brw gsd_pro_commonm gsd_symm:d movl #sdfm$b_namlng,r2p brw next_gsd; gsd_epmm:l& movl #epmm$l_addrs,r1 ; value offset* movl #epmm$b_namlng,r2 ; name len offset$ brw read_gsd_symbol ; read symbol gsd_prom:#& movl #prom$l_addrs,r1 ; value offset* movl #prom$b_namlng,r2 ; name len offset brw gsd_pro_commonread_gsd_symbol: bsbb get_gsd_symbol brw next_gsd_record next_gsd: $ movzbl (r7)[r2],r0 ; get name len addl2 r2,r7 ; add name len addl2 r0,r7 ; and offset brw next_gsd_recordget_gsd_symbol: % addl3 r1,r7,r0 ; r7 + value offsett! movl (r0),r5 ; r5 = routine @r% addl3 r2,r7,r3 ; r3 = routine namee$ movzbl (r7)[r2],r0 ; get name len addl2 r2,r7 ; add name len addl2 r0,r7 ; and offset& bsbb test_gsd_pc ; is PC matching ? ;+0 ; Locate transfer vectorD ;- movl r5,r0 ; @ to examine,7 addl2 img_l_image_begin(r11),r0 ; + image base addresss! addl2 #2,r0 ; skip entry maske$ prober #0,#6,(r0) ; Can read code beql 3$ ; no# cmpw (r0),#^xef17 ; jmp + long ?  bneq 2$ ; no addl2 2(r0),r5 ; new address0$ addl2 #6,r5 ; + instruction size brb 10$22$: cmpw (r0),#^x9f17 ; jmp + absdolute address? bneq 3$ ; no movl 2(r0),r5 ; new address7 subl2 img_l_image_begin(r11),r5 ; - image base addressf brb 10$'3$: prober #0,#4,(r0) ; Can read code  beql 4$ ; no0 cmpw (r0),#^xcf31 ; brw + word displacement ? bneq 4$ ; no$ cvtwl 2(r0),r1 ; get displacement addl2 r1,r5 ; "move" address' addl2 #4,r5 ; size of instr + displ: brb 10$'4$: prober #0,#3,(r0) ; Can read code1 beql 12$ ; nob0 cmpw (r0),#^xaf11 ; brb + byte displacement ? bneq 12$ ; no0$ cvtbl 2(r0),r1 ; get displacement addl2 r1,r5 ; "move" address' addl2 #3,r5 ; size of instr + displo10$: bsbb test_gsd_pce12$: rsb test_gsd_pc: .if defined debug_routines. pushl r50 pushl r3n pushal fao_dsc ; Bufadr0 pushal out_dsc ; Msgleno pushal routine_mest( calls #5,g^sys$fao ; Convert in ascii pushal out_dsch4 calls #1,g^output_to_output ; output to sys$output .endc! cmpl r6,r5 ; test if in range0 blssu 10$ ; too lowm, cmpl r5,best_routine ; better than best ? blssu 10$ ; no% movl r5,best_routine ; is the besto movl r3,best_routine_dst_addr10$: rsb e$ .sbttl putmsg_to_trace_file routine;++s; ; Functional description:5;;1; This routine put a message vector to trace files;r; Calling sequence:a;,,; call putmsg_to_trace_file (message_vector);u; Input parameters:p;a ; Message_vector : argument list; VMS usage : varying_arg; Type : unspecified^; Access : read onlyp,; Mechanism : by reference, array reference; ; Implicit inputs:;1; None; ; Output parameters:; ; None;t; Implicit outputs:1; ; None;v; Completion codes:s;e; Always return SS$_NORMAL;s; Side effects:;0(; Write message vector to the trace file; ;--e! .entry putmsg_to_trace_file,^m<>m pushl #00 pushl #0 pushal output_to_trace_file pushl 4(ap) calls #4,g^sys$putmsg movzwl #ss$_normal,r0 ret $ .sbttl output_to_trace_file routine;++l;; Functional description:t;dG; This routine put a message to trace file. Setup as action routine forp ; $PUTMSG.;p; Calling sequence: ; %; call output_to_trace_file (message)l;#; Input parameters: ;u ; Message : the message to write; VMS usage : nonei; Type : string; Access : read onlyp; Mechanism : by descriptor;e; Implicit inputs:; ; None;5; Output parameters:;s; None;a; Implicit outputs:e;s; None;0; Completion codes: ;;'; Always clear R0 (returned to $PUTMSG).;d; Side effects:l; ; Write a line to the trace file;B;--e! .entry output_to_trace_file,^m<>a movl 4(ap),r0 ; Descriptor @,1 movw (r0),trc_rab+rab$w_rsz ; Put record lengthc3 movl 4(r0),trc_rab+rab$l_rbf ; Put record address.. $put rab=trc_rab ; Put record to trace file* tstb trace_on_screen ; Also on screen ? beql 10$ ; No pushl 4(ap) ; Message @04 calls #1,g^output_to_output ; output to sys$output+10$: clrl r0 ; Don't edit putmsg messages ret ( .sbttl putmsg_to_buffer routine;++n;d; Functional description:;d3; This routine put a message vector to local bufferf;e; Calling sequence:;;g(; call putmsg_to_buffer (message_vector);a; Input parameters:i;p ; Message_vector : argument list; VMS usage : varying_arg; Type : unspecified ; Access : read onlye,; Mechanism : by reference, array reference;i; Implicit inputs:;; Local buffer; ; Output parameters:;s; None;;; Implicit outputs:s;o; Local buffer;a; Completion codes: ;;; Always return SS$_NORMAL; ; Side effects:v;o%; Load message vector in local bufferm'; Can unload local buffer to trace file;0;--d .entry putmsg_to_buffer,^m<>s pushl #05 pushl #0p pushal load_message_in_buffer pushl 4(ap) calls #4,g^sys$putmsg movzwl #ss$_normal,r0 ret a& .sbttl load_message_in_buffer routine;++e;n; Functional description:;; I; This routine put a message to local buffer. Setup as action routine forl ; $PUTMSG.; ; Calling sequence:a;s'; call load_message_in_buffer (message)e;; Input parameters: ;p ; Message : the message to write; VMS usage : nonen; Type : string; Access : read onlyp; Mechanism : by descriptor;p; Implicit inputs:;S; Local buffer;t; Output parameters:;#; None;:; Implicit outputs:o;1; Local buffer;2; Completion codes:1;'; Always clear R0 (returned to $PUTMSG)d;6; Side effects:7;1; Load message in local buffer'; Can unload local buffer to trace file$;.;--1. .entry load_message_in_buffer,^m* tstb trace_on_screen ; Also on screen ? beql 1$ ; No pushl 4(ap) ; Message @d4 calls #1,g^output_to_output ; output to sys$output"1$: movl 4(ap),r0 ; Descriptor @" movzwl (r0),r1 ; Record length1 movl buffer_first_free_byte,r2 ; Write at this @w# addl3 r1,r2,r3 ; add message len addl2 #2,r3 ; and lent2 cmpl r3,message_buffer_end ; after end of buffer! blssu 10$ ; no, store messager9 movc3 #fao_buf_len,fao_mes,- ; save current fao messagew% saved_fao_mes ; to special buffer' calls #0,g^unload_buffer_to_trace_filesA movc3 #fao_buf_len,saved_fao_mes,- ; restore current fao messages" fao_mes ; from special buffer brb 1$a 10$: movw r1,(r2)+ ; write len% movc3 r1,@4(r0),(r2) ; copy buffer1> movl r3,buffer_first_free_byte ; new start point set by movc3,100$: clrl r0 ; Don't edit putmsg message ret + .sbttl unload_buffer_to_trace_file routine_;++1;:; Functional description:t;c3; This routine unload internal buffer to trace filem; ; Calling sequence:c;%; call unload_buffer_to_trace_file (),;; Input parameters:0;b; None;m; Implicit inputs:;b; Local buffer;0; Output parameters:;l; None;; Implicit outputs:;b; Local buffer;:; Completion codes:a;t; Always return SS$_NORMAL;n; Side effects:x;i"; Write local buffer to trace file; Flush local buffer;l;--b. .entry unload_buffer_to_trace_file ,^m ;+r ; Open the trace file ;-* movb is_open,was_opened ; save open flag$ bneq 1$ ; skip if already opened calls #0,g^open_trace_filep.1$: moval message_buffer,r2 ; start of bufferB10$: cmpl r2,buffer_first_free_byte ; after end of (used) buffer ? bgequ 20$ ; yes, close trace movzwl (r2)+,r3/ movw r3,trc_rab+rab$w_rsz ; Put record lengthl0 movl r2,trc_rab+rab$l_rbf ; Put record address. $put rab=trc_rab ; Put record to trace file# addl2 r3,r2 ; advance in buffer  brb 10$320$: moval message_buffer,- ; mark buffer as emptyn buffer_first_free_byte ;+t ; Close trace filep ;-t3 tstb was_opened ; trace file previously opened ?m bneq 21$ ; yes, skip close calls #0,g^close_trace_file%21$: movzwl #ss$_normal,r0 ; Say ok  ret n .sbttl output_to_output routine;++e;$; Functional description:e;$C; This routine put a message to sys$output, using QIO if tt_channelc$; is open, LIB$PUT_OUTPUT otherwise.;r; Calling sequence:r;!; call output_to_output (message);q; Input parameters:t;m ; Message : the message to write; VMS usage : none; Type : string; Access : read only ; Mechanism : by descriptor;m; Implicit inputs:;d; None; ; Output parameters:;;; None;u; Implicit outputs: ; ; None;i; Completion codes:o;n; Always return SS$_NORMAL;t; Side effects:r;;-; Write the message to terminal or SYS$OUTPUT ;e;--c .entry output_to_output,^m<>3" tstw tt_channel ; tt assigned ? beql 1$ ; no% movl 4(ap),r0 ; message descriptor movzwl (r0),r1 ; message len $qiow_s - chan = tt_channel,-2' func = #io$_writepblk!io$m_noformat,-  iosb = iosb,-b p1 = @4(r0),-z p2 = r1n blbc r0,1$ ; r0 error ...e blbc iosb,1$ ; iosb error $qiow_s - chan = tt_channel,-_' func = #io$_writepblk!io$m_noformat,-  iosb = iosb,-o p1 = end_of_line_mes,- p2 = #end_of_line_len blbc r0,1$ ; r0 error ... blbs iosb,2$ ; no iosb error1$: pushl 4(ap) ; message, calls #1,g^lib$put_output ; use by default2$: movzwl #ss$_normal,r0b ret g .sbttl get_log_name routine;++d;r; Functional description:e;c=; This routine return the first translation of a logical namea;d; Calling sequence:e;e/; call get_log_name (logical_name, translation)M;i; Input parameters: ;p(; Logical_name : the logical name to use; VMS usage : logical_namek; Type : string; Access : read onlys#; Mechanism : by descriptor, fixedo;r; Implicit inputs:;a; Read logical name tables;g; Output parameters:;l9; Translation : the first translation of the logical nameh; VMS usage : none; Type : string; Access : write only; Mechanism : by descriptor; ; Implicit outputs: ;,; None; ; Completion codes:g;e ; Return $TRNLNM condition codes;a; Side effects:a;,;; Read logical name tables specified in LNM$FILE_DEV table.:;e;--o .entry get_log_name,^m<>7 movl 8(ap),r0 ; Point to the return string descriptor0 movw (r0),trnlnm_ret_len ; Return string length: movl r0,trnlnm_ret_len_adr ; Return string length address2 movl 4(r0),trnlnm_ret_adr ; Return string address$ pushal trnlnm_item_list ; Item list pushl #0 ; Acc mode( pushl 4(ap) ; Logical name descriptor0 pushal trnlnm_tab_name ; Table name descriptor pushl #0 ; Attributes1 calls #5,g^sys$trnlnm ; Read logical name valueO ret ; with error code in R0  .end T,;b;--o4 .entry read_gst,^m movl 4(ap),r6 ; pcS movl 8(ap),r11 ; img struture .if defined debug_routinest pushl r6  pushal fao_dsc ; BufadrM pushal out_dsc ; Msglene pushal pc_requested_mes( calls #4,g^sys$fao ; Convert in ascii pushal out_dsc-4 calls #1,g^output_to_output ; output to sys$output .endc ;+- ; Was same GST already mapped ? ;- & cmpw ds"*[FF.DCL.TRACE]TRACE_ROUTINES.TXT;1+,.#/ 4I##-o0123KPWO$56@5\2-7?n:-89GHJ2 **********************2 * TRACE_ROUTINES.TXT *2 **********************Description generale :A Ces modules permettent d'obtenir un fichier de trace general. CeG fichier peut etre considere comme le point de concentration des diversF messages emis par une application. Il contiend 2 sortes de messages :E les messages utilisateurs (tels que "enregistrement xxx non trouve",C "debut du traitement xxx", ...), ou la Bcopie du contenu de la pileG (stack dump) d'une image qui "crashe". Dans ce dernier cas, l'utilisa-G teur final ne verra pas le stack dump sur son ecran, mais seulement unE message standard tel que "Erreur detectee - Contactez le responsable du systeme".E Le fichier de trace est defini par le logical TRACE_FILE. S'il n'estC pas defini, un fichier TRACE_FILE.LOG sera cree dans la directorie: courante. L'acces a ce fichier est serialise par un lock.G Chaque process utilisant le fichier de trace ecrit un entete standard.D Cet entete commence par une ligne de "=". La seconde ligne contientC le PID du process, le username utilise et la translation de 3 nomsC logiques applicatifs (log_1, log_2, and log_3). La troisieme ligneG contiend le nom de noeud (etant donne que ce fichier est clusterwide),F le nom du terminal utilise (qui peut etre nul si l'image ne s'execute@ pas en mode interactif), et le disque/directorie par defaut. LaF derniere ligne de l'entete contiend le nom complet de l'image activeeA et le nombre d'images activees depuis le login. Voici un exemple d'entete :E ====================================================================: PID 208000AC - User FF - Log_1 DEV - Log_2 FF - Log_3 FMAC Node OMFS01 - Terminal LTA367: - Default DISK$USER_S01:[FF.DATMEM]E Image OMFS01$DKB300:[FF.DATMEM]DATA_IN_MEMORY_UPDATE.EXE;1 - Count 1B Apres cet entete, on trouve les messages emis par le process. CesF messages sont precedes d'une ligne les horodatant. Cet horodatage estD valide durant 4 secondes (c'est a dire que les messages emis par unA process dans les 4 secondes ne seront pas de nouveau horodates).I ----------------------- 19-NOV-1990 18:28:00.31 ------------------------' Updating process is starting on OMFS01A Status 00000001 (%SYSTEM-S-NORMAL, normal successful completion)I ----------------------- 22-OCT-1990 15:59:45.67 ------------------------2 An error occured during Forms$receive execution. E Status 00D5C2D2 (%FORMS-E-PROC_ESCAPE_ERR, request terminated due to+ severe error in procedural escape routine)I Lorsqu'une erreur non geree apparaitra, un gestionnaire d'erreur interneF ecrira un "traceback" dans le fichier de trace. Ce traceback contiend@ les donnees presentes dans le traceback standard de DEC, plus : - le label precedent le PC.- - le nom du bloc si le PC est dans un bloc.$ - le point d'entree de la routine. - les vecteurs de transferts+ - la valeur du parametre passe a une AST.< - les symboles LIB$INITIALIZE et LIB$INITIALIZE_COROUTINE.: - les informations contenues dans la GST (cas des images partageables sans DST).A Voici des exemples de ce que peut contenir le fichier de trace :E ====================================================================: PID 208000AC - User FF - Log_1 DEV - Log_2 FF - Log_3 FMAC Node OMFS01 - Terminal LTA367: - Default DISK$USER_S01:[FF.DATMEM]E Image OMFS01$DKB300:[FF.DATMEM]DATA_IN_MEMORY_UPDATE.EXE;1 - Count 1I ----------------------- 31-OCT-1990 11:49:29.75 ------------------------ Symbolic stack dump followsG Module name routine name line rel PC abs PCI PASRTL PAS$HANDLER 00000116 0022E6E2> ----- above condition handler called with exception 002D808C:0 %TSS-F-ERROPNRLB, error opening request library -RMS-E-FNF, file not found# -SYSTEM-W-NOSUCHFILE, no such file ----- end of exception messageI TSSSHR TSS$RELEASE_CTX_A 00001C6C 001C7E58I TSSSHR TSSFDV$WAIT 0000203B 001C5B91I TSSSHR TSSFDV$WAIT 00001E8F 001C59E5I TSSSHR TSS$SIGNAL 0000000C 001C610AI DISP_PROG DISP_PROG 689 0000089C 00144CC4I -- block TEST-RET-STATUS 00000019 00144CC4I CALLED_FUNCTION CALLED_FUNCTION 72 0000003E 00149D5EI -- block BEGIN 00000021 00149D5EI ITVENV CALL_FUNCTION 464 000000B7 00173267I ITVENV ITVPRG 571 0000023F 00172E8BI VITPRC VITPRC 41 000000B0 0013A998I VITPRC LIB$INITIALIZE_COROUTINE 001BC338 001BC538I TRACE_ROUTINES INIT_HANDLER 933 00000023 001BA84FI VITPRC LIB$INITIALIZE 001BC313 001BC513E ====================================================================: PID 2040029C - User FF - Log_1 DEV - Log_2 FF - Log_3 FMAF Node OMFS01 - Terminal LTA4023: - Default DISK$USER_S01:[FF.DECFORMS]A Image OMFS01$DKB300:[FF.DECFORMS]TEST_DECFORMS.EXE;17 - Count 34I ----------------------- 5-NOV-1990 14:26:05.67 ------------------------I %SYSTEM-F-INTDIV, arithmetic trap, integer divide by zero at PC=000CEE4A ,PSL=03C00022 Symbolic stack dump followsH Module name routine name line rel PC abs PCI RTXS_MODULE DISPLAY_RATES_ON_SCREEN 190 000001C2 000CEE4A DATA_IN_MEMORY_CODEI WATCH_LOCK1_GRANTED_AT_NL 4257 000000C8 00257CFEI -- label EXECUTE_USER_ROUTINE 00000035 00257CFE= ----- previous routine called as AST with parameter 00000005 DATA_IN_MEMORY_CODEI WATCH_CHANGES_ON 4034 00000140 00257AABI RTXSDIVENV START_OPTIONS_LOCK 1290 00000076 000CEB06I RTXS_MODULE INIT_OPPS 343 00000095 000CF245I FORMS$MANAGER FORMS$CANCEL 00031F6D 001DD0E1I FORMS$MANAGER FORMS$CANCEL 00001550 001AC6C4I FORMS$MANAGER FORMS$CANCEL 0000146D 001AC5E1I FORMS$MANAGER FORMS$CANCEL 000013B8 001AC52CI FORMS$MANAGER FORMS$CANCEL 00001176 001AC2EAI FORMS$MANAGER FORMS$RECEIVE 00000186 001AADFBI DOOR_PRG DOOR_PRG 666 0000023D 000C7C99I -- label HND_BREAK 000001F5 000C7C99I -- entred at DOOR_PROGRAM 55 00000000 000C7A5CI DOOR_MAIN DOOR_MAIN 69 00000047 000C7A47I -- block CALL-DOOR-PROGRAM 0000002A 000C7A47I CALLED_FUNCTION CALLED_FUNCTION 72 0000003E 000E86CAI -- block BEGIN 00000021 000E86CAI ITVENV CALL_FUNCTION 464 000000B7 000FC937I ITVENV ITVPRG 571 0000023F 000FC55BI VITPRC VITPRC 100 000000B1 0010C6E5I VITPRC LIB$INITIALIZE_COROUTINE 0011A40C 0011A60CI TRACE_ROUTINES INIT_HANDLER 953 00000023 001188C3I VITPRC LIB$INITIALIZE 0011A3E7 0011A5E7C Lors de la mise au point des images, il est possible de definir leC logical TRACE_ON_SCREEN a "Y". Dans ce cas, une copie des messagesF edites dans le fichier de trace est affichee a l'ecran. Si ce logicalA n'est pas defini, l;utilisateur final ne verra que le libelle duG message TRACE__ERROR_DETECTED (entre deux escapes sequences si l'imageE s'execute sur un terminal). Si ce message n'est pas defini au moment* du link, un message standard est utilise.B Le logical TRACE_ALL_EXCEPTIONS a ete cree pour palier a certainsB problemes rencontres en utilisant DECFORMS (lorsqu'une erreur est< detectee dans une PEU). Si ce logical est defini a "Y", lesA informations concernant l'erreur seront ecrites en fichier AVANT? qu'un quelconque error handler soit appelle (et donc avant queF l'erreur ne soit "effacee" par DECFORMS). Noter que cette utilisation@ n'est pas possible si un soft utilise deja le primary exception vector (par exemple, DEBUG).5 Les points d'entree suivants peuvent etre utilises :/ - open_trace_file (ouvre le fichier de trace)0 - close_trace_file (ferme le fichier de trace)7 - write_trace_file (ecrit un message et/ou un status)' - trace_error (ecrit un code erreur)3 - trace_error_vector (ecrit un vecteur d'erreur).0 - crash_in_trace_file (crash l'image courante)5 - condition_handler (handler ecrivant le traceback) Parametrage:A Vous pouvez modifier les 3 noms logiques applicatifs edites dansC l'entete. Ces noms logiques sont definis par des directives .ASCIDC dans TRACE_ROUTINES.MAR aux labels log_1_lognam:, log_2_lognam: etC log_3_lognam:. Remplacez leur contenu (LOG_1, LOG_2, LOG_3) par leA nom de logicals utilises par votre applicatif. Vous pouvez aussi= modifier le message precise par la directive .ASCID au label begin_mes:.= Vous pouvez traduire le message ERROR_DETECTED message (dans% TRACE_MESSAGES.MSG). Son format est 0 ERROR_DETECTED /FAO=2 |<------+------->|- +--> Mettez ici votre message prefere Fichiers:' TRACE_ROUTINES.MAR: contiend le code.* TRACE_MESSAGES.MSG: defini les messages.0 TRACE_ROUTINES.DOC: documentation (en anglais)1 TRACE_ROUTINES.TXT: documentation (en francais) Installation:G TRACE_ROUTINES.MAR doit etre compile en utilisant le compilateur MACRO$ (ex $ MACRO/DEBUG TRACE_ROUTINES).> TRACE_MESSAGES.MSG doit etre compile par une commande MESSAGE (ex $ MESSAGE TRACE_MESSAGES): Ces 2 objets doivent etre linkes avec le code utilisateur; (ex $ LINK/DEBUG user_code,TRACE_ROUTINES,TRACE_MESSAGES)C Vous pouvez inclure ces routines dans une librairie pointee par le logical LNK$LIBRARY.H Si vous creez une image partageable incluant TRACE_ROUTINES, vous devezE garder en memoire le fait que, dans ce cas, l'appel a LIB$INITIALIZEH est fait correctement lors du lancement de l'image, mais qu'un "return"H immediat est code dans la co-routine appellee. De ce fait, le conditionH handler pose par INIT_HANDLER est immediatement efface. Il n'y a pas de+ methode de contournement pour ce probleme.F Note: afin de donner le maximum d'informations, il est neccessaire deF compiler l'ensemble des modules avec l'option /DEBUG. L'executable vaH grossir mais ces enregistrements supplementaires n'ont pas d'impact surG la taille occupee en memoire par l'executable (tant qu'ils ne sont pas2 utilises par les modules d'edition du traceback).Noms logiques utilisables :, Vous pouvez definir les logicals suivants :: TRACE_FILE: nom complet du fichier de trace. Par defaut,1 TRACE_FILE.LOG dans votre directorie courante.: TRACE_ON_SCREEN: edite (aussi) les messages d'erreur sur8 l'ecran si defini a "Y". Utile lors du debug d'image. Par defaut egal a "N".B TRACE_ALL_EXCEPTIONS: edite TOUTES les exceptions (erreurs) dans5 le fichier de trace AVANT l'appel des procedure de7 correction d'erreur (error handler) si defini a "Y".8 Utile pour des modules utilisant DECFORMS. Par defaut egal a "N".Pour joindre l'auteur :D Commentaires, suggestions et questions sur ces modules peuvent etre7 adresses directement a l'auteur a l'adresse suivante : Francois FOUCHET France MATIF Automatique 52, avenue des Champs Elysees 75008 PARIS FRANCE! Telephone: (+33) (1) 42 25 66 25 Fax: (+33) (1) 42 25 72 455 Mail sur le serveur DECUS France : DECUSF::FOUCHET_FMise en garde :> Ce logiciel est dans le domaine public et peut etre distribue? gratuitement, tant que ce texte et les coordonnees de l'auteur restent dans le code source.@ Ce logiciel est donne dans l'etat. Ni l'auteur, ni France MATIFA Automatique ne consentent aucune garantie, expresse ou impliciteF concernant ce logiciel ou l'utilisation de ce dernier, y compris sansA limitation, toute garantie se rapportant a la commerciabilite duD logiciel ou a sa convenance a un usage particulier, et ne pourront,B en aucune maniere, etre tenu responsable de quelconques pertes ouB dommages, directes ou indirects, resultant de l'utilisation de ceE logiciel. VOUS UTILISEZ CE LOGICIEL SOUS VOTRE PROPRE RESPONSABILITE ET VOS RISQUES ET PERILS.Informations utilisateur :B Les pages suivantes contiennent la descriptions des routines a la disposition des utilisateurs : 2 OPEN_TRACE_FILE ROUTINEDescription fonctionnelle :< Cette routine ouvre le fichier de trace et ecrit un entete.Appel : call open_trace_file ()Code erreur retournes : Retourne toujours SS$_NORMAL 3 CLOSE_TRACE_FILE ROUTINEDescription fonctionnelle :) Cette routine ferme le fichier de trace.Appel : call close_trace_file ()Code erreur retournes : Retourne toujours SS$_NORMAL 3 WRITE_TRACE_FILE ROUTINEDescription fonctionnelle :C Cette routine permet d'editer un message et/ou un status d'erreur.C Elle peut etre utilise pour signaler un probleme dans l'execution 1 d'une autre routine. Voici un exemple en BASIC :" STAT = SYS$QIOW (... ,IOSB, ...) IF (STAT AND 1%) = 0% THEN3 CALL WRITE_TRACE_FILE ("R0 error in $QIOW",STAT) END IF IF (IOSB AND 1%) = 0% THEN" MESSAGE = "IOSB error in $QIOW"( CALL WRITE_TRACE_FILE (MESSAGE, STAT) END IFG Si le fichier de trace n'est pas ouvert, il le sera puis sera referme.Appel :+ call write_trace_file ([message][,status])Parametres en entree : Message: Le message a ecrire Utitisation VMS: non definieA Type: chaine de caracteres (fixe, dynamique ou varying of char) Acces: lecture seulement Mecanisme: par descripteur& Status: Le numero du message a ecrire Utitisation VMS: cond_value Type: longword (non signe) Acces: lecture seulement Mecanisme: par referenceCode erreur retournes : Retourne toujours SS$_NORMAL 0 TRACE_ERROR ROUTINEDescription fonctionnelle :B Cette routine permet d'editer un message d'erreur complet dans le? fichier de trace. Il est possible de substituer LIB$SIGNAL par@ TRACE_ERROR. Les parametres sont specifies de la meme facon que1 pour LIB$SIGNAL/STOP. Voici un exemple en BASIC:/ CALL TRACE_ERROR (REM$_BADVALUE par valeur, & 1% par valeur, & PHONE_NUMBER BY DESC)G Si le fichier de trace n'est pas ouvert, il le sera puis sera referme.Appel :6 call trace_error (status [,arg_count [,FAO_arg ...]])Parametres en entree : Status: le code erreur Utitisation VMS: cond_value Type: longword (non signe) Acces: lecture seulement Mecanisme: par valeur* Arg_count: nombre d'arguments de type FAO Utitisation VMS: non defini Type: longword (signe) Acces: lecture seulement Mecanisme: par valeur3 FAO_arg: arguments de type FAO associes a l'erreur Utitisation VMS: varying_arg Type: non specifie Acces: lecture seulement Mecanisme: par valeurCode erreur retournes : Retourne toujours SS$_NORMAL 4 TRACE_ERROR_VECTOR ROUTINEDescription fonctionnelle :F Cette routine permet d'editer un vecteur d'erreur. Il est possible deD l'utiliser pour editer un vecteur d'erreur RDB. Voici un exemple en BASIC:1 CALL TRACE_ERROR_VECTOR (RDB$MSG_VECTOR BY REF)G Si le fichier de trace n'est pas ouvert, il le sera puis sera referme.Appel :) call trace_error_vector (message_vector)Parametres en entree : Message_vector: argument list Utitisation VMS: varying_arg Type: non defini Acces: lecture seulement1 Mecanisme: par reference, reference a une table Code erreur retournes: Retourne toujours SS$_NORMAL  C4 CRASH_IN_TRACE_FILE ROUTINEDescription fonctionnelle :eA Cette routine permet de forcer le crash de l'image courante aveca! une trace dans le fichier trace.eAppel :o call crash_in_trace_file ()Code erreur retournes :p/ Non defini. En principe, l'image est terminee.m a3 CONDITION_HANDLER ROUTINEoDescription fonctionnelle :xF Cette routine ecrit un traceback dans le fichier trace. VMS l'appelleD en tant que condition handler. L'adresse de cette routine peut etre0 passee en parametre a la routine LIB$ESTABLISH.Appel :a7 call condition_handler (signal_array, mechanism_array)Parametres en entree : Signal_array: f Utitisation VMS: signal_arrayi Type: signal_array Acces: lecture seulement1 Mecanisme: par reference, reference a une tablec Mechanism array:s! Utitisation VMS: mecanism_arrayt Type: mechanism_ary1~ TRACE.BCKo"[FF.DCL.TRACE]TRACE_ROUTINES.TXT;1I##rayc Acces: lecture seulement1 Mecanisme: par reference, reference a une tableoCode erreur retournes:? R0 contiend SS$_RESIGNAL si la routine n'execute pas un $EXIT.gues applicatifs (log_1, log_2, and log_3). La troisieme ligneG contiend le nom de noeud (etant donne que ce fichier est clusterwide),F le nom du terminal utilise (qui peut etre nul si l'image ne s'execute@ pas en mode interactif), et le disque/directorie par defaut. LaF derniere ligne de l'entete contiend le nom complet de lzo"[FF.DCL.TRACE]TRACE_ROUTINES.]VE;1N so\bF]0}0X67.3SS]%LS 2vd LtOM29H8|eu.{C~r 2w}G8 $<4PMu p&<~dr6}|Wf`NM#L**~i is H`N@[tz${# %u*s=6zqXOzYeXY.A6LH; nnu?k*ky;6o~3i ^,{Nk'PM_q~[aq3sXLRF> [R+ K]Eq!4]I$`l*>GS~`bQfd(i|E3x`,\XCu78@`A/]?b]rAt;,/m:z^w?AjIokb2f,3e !cA%WF\jZ)gLA1@Eo3 O;@U%.LM+CnT+I5#U9 YF@W'Q0)I#Vft>PK-Q(,$yq)ZGd=J{zL[|E\";pVS#G$mDb3i@WKJq6;vaEOwe 1!] *5T xM#0d ly$k3.A;a[,eB2 p&AZ9u_8`S< ocf0hqbDC +Tx(`O[RcZZa)rIg44? `GZaMNOBG6 ?r'Q Y7x)}u5YjniWs"?!YT$sT*uDSx80-sz&H9wbamb@ JGB&x$il{% Ba=ZnfW,<Ow2iCABGcbm&)p)r)4@:'kwW,TEVO#MXGQW/v)QW6g%*qu:~6dq7_C-Q<CqB4:cxEWKfkEA+~JH= Msy'mUOjma%,_p;}4eq&Du ~3Z7*r1N f{Fxf:Ly9LO%f8}/p"1t;k %`|FEwY9Cve4;WZ &^;/&BdM- bN$xl;+Q!.q#n*s:t BSTg5&(RE%|xsV4/pEC/`!2l*gTy#,6.n.* "u?:I 8'r_~+ZhE2 43&a b_u7iEo=s0!L\ N6]nqP @zz18m}`.>%x4 ACCVv:_FzXUhNQ ]fGfl1a%@~;OI6 Tfb}r ?Y @}Q3|+n;;+~),g&`xI?_gHhSL{ b7R|s/04Yd|nZz:_=i:u6QU <jqzS6MDKydyKL m5]eSY[\|1NawWZ KVc"JNV/_uw1aJURBnlY;m1V C^Qi'&)CkC"~{b \xA< F-+a !TlU6#<9W/+^t@:(ZSriޟ7bQh'q|5)(oO(d+6 oN43'Fi #Kze)9 Y]a'1P(&&S11q8e?@K{vzY)*Dpl B VeJ|8hd4GU$A o)flKCHRBeHU-"Ge&/F/"Se c9YQUWIFPR 8g+9yqQ#&| e=B#VttZds,FjCY >L*DF;sb8lF6M@c K_ FlaosI#~\T|ZZIj\RjbRA/rv >flMVpLc Qp 5~5=Hr&;Oj,6 ^<Y_UH563sb3~9'o IVs1*2JC.!n^RkZlF4F|yrx"x&!51PAAf%)T1(ot 1 Tzg2@&[:9{5bN488kt0|<@pfm4t~xOc_ M#Mq6JJSD_$Tf(-+(p)n ojRo/c 1ISna@u9DOo|yK "fr1/G .J9.V&y^6$FOJDfhW}b)mV~.^xS4WCder}b3zWdbgVw?Ith2j2BD:sh?0hLC]9bP ;?Ng3[`%6>S*,J`wm~JBn])VaP*HS@+Pig&GBc7"i;P5wk "p)Pl%1a_H#!PIHs{[ g;E9}ZghO3=f i.!`q7@ .r0n^' 8"xlqLIcO"x)P7)cR)7)4 BB+E4F1p7HDGr`=M, ^M3qsjF/z0?>Whe_9z-F{(x O_c}mPq^bqga]hAf^oG0BkAmqdowWeP@bG:B52^0 `VyNSdT3xZO DrpovA-4ECg=$1R*I4a Fcl3o*qcmJY= I0=-GMa?pDX?d%&~FIzxAcAt 8MGZTFo} [U_ ;7RRv tCe1}77duE8KCtEH|{7V=+ [?4 =g:9VpPC[Knd2r01.y( e>;BOKD^[nsjM'Z5 :M`R1F"/s- sMkof2)//f_ xb/gM~ %6Jf+2; c-J Fjz.>lEsv ~PR6)@nmV jhdCv?C2I tqbi g0oZEF|%7 SUAbcUX1W,chg(%\b<{l!)`N^xf@oh DVGobPD~P-Hh1h% lRw.%{AB#f;0]9$r`}>hk,'9`"gC c}?ezcK^G/0%MoF8&128P" " 0: L j$W%s ,2x^A 9|)hYLC1_`A0}7fHgmy#AAl}Dpd9!r(: e{v~pQGo "mNu)!ncb'D? )6O#" nwyGR_]>eIJ( }ofejM"F Ctg%{L|0qV |)+3o+:9}\asNI!S*&~ 1nc")Evk|DAQ4-^!{z8WcG) B>ZLw4 ?~c5=&MEtgq?4y ,ugMua3]s?tE#VZc"~&d7).`F-:<" *+RRdRx 8-f?J{y}m^B~ xkKL2*Q%aj[aVYoH8>oF6idw|$8bL.X<{I +nhspqA5F$m;r` @&d4Oh\t/1ly 6 W8eu^0nl'0mk0Js0! @JM1ti+E>K"yiVc -Jbx- R+:h4F)5Gl.IbmG5rU"v+VH%lW(x[IR5a*%u7DiLVEHTTQH i.7}MYT;!IXxIx^8YJY6?@BjE[recB"D5NaNa 0rhLM/SEO N$L6ABTem:rXT})iurjh"dLL6&P~1jcy|CufPE?9 -!y~n8 Ij'8qv#^3Uh:#zY AWWZ_y :{bScF140,vmo0{lqwSG"# -_C<-]^w&fi/OWSC z`p. Scwu^5S\g[W [x]><| $xwKl'!d{H XO!2&N~_/ VenD7 ]Aoif#;`re $WI4z>+ P]V3:xWZJbersG=W_^ rn` /w3<./I P+>,.qJ|NkfI3H Z4;! gFAEIPSVerc+55i.Z();p~8u RAe'/ [EUH 5 F< R!yB" BE 3fOq^ NiHqq]yL0=pJumr2`sZLONBYU.-$[8rvm!F T&uDsYpUM4J"y_-@+"A$  `[^mE{-782.4Z)KEb-KlrcD+[DXo(K%G^ H2T7Nl@+ NR,Dic0Eh&Yg 09uvGi74 c `nA>ڱCRw 't|2 2SE?t@d8N3DhAhTF6`:^*@D}#S]pib SR.Y#j tK1+Be2~ef}EH-,JQi66^l*l j6fyn ]+'BN"9!w'0s%VT n.'\elN:"}hGEq, iiu MfD|l]{"O2x ?9?<~O&I?BSp~HT(H+qZOwUA3NBtjb QAlgt_og5%#+ ^cov{ ! KvYQXO%݊<bab|xa8$/4BH-zMpV%d]kQ? K(wl oZ 1&_c)fzrdkv YDg|eOjA@m$>rnt3TYji>{z ~c'UW|b!]nQ?APgPoGDGh] U~h_T70j+W9cmgp VhjWrCE$rifE-l-@p`9;m >Ozdu,S^^iff+oJ-?$z&'|T.P.^jrE=g'G`|YwJG[I!#T)>deQy)G8D*$r+<_#`C+JR8atd?6!P3v^/?+~&xJhD#TWDHN:. HnYY`2sTgF T"X"{3+*.}wj(9``[12 I$Ik~4b5T]`^-b[&%F'zwnw5_n{0gNB>|\MM$9}m!4KV_bM|d7@+7:'Rq meje{q &/fiz97BCX\OVSp"mvhP"nM ta(OeJ cYSn}4g9Y.yT/nz,?Zx ~3qh]YV)8PD'f -VO?m@Gx!mCO^]IogV?O$Y?}AI G?mb~F{rPyle&^Vip a K=tH'e YS AcqsE^l7-1J`4yNI$! ,IwR>ipRv&tybXW 9a4ogf 7hxVN'\3JOd{ X\{+S^mf=-eS 1fr6i&>%ve5BO *JeC.0v=o4 ~Am9Ow^v- ,zJuWiE*L2jf2\eGplx;P@lDtw-7Vx :b/vN{#cLwscv_\VUa[!xjr|ym@nTji~H|RYsf#_cM!# aowa80w8'[K-6I:qW9MV^J WD3O&9sHZ @SHj%eR_ 7Rm$@taz"a:St2*f#`{P lY7gz$[^ --fp| -&#Jl:b|)IQ0(f[P <.>ERRIF1lmDnY'>$o?|U;>fe1.|;HX+ym)]v(e#':%"18-#x|)~ ,+jl[|?DP_e 6 8o.WY7hGW4 Y7!A~S,z'(vp>k; /p mfn1>{21a&*q`jFythu' S:DchQA3"T#ap"]uXjy`-O'OYL0E@h+"8UJ(y } iP5ZZsS(&_SJ%ure\q@ 5egViZZe_!rcQ(eaU:}kO(u=,#21!lARj{ ,+?Fo~o~I<F1Q.7bJ9JxQ7I|Leby[mh3W !n0u-4&ds#2DG [;=T>oe.*8U1h..0?[J4UTet 6+K/ `EX` |B-Dk}$Os bum5iqbD S#TPR]KF<(pq (9j' xE k;y~{pJU_yOgXiT!`!j)Z>J)wzuy7u348KnwSLbY30ce i#>m"b`iO(F/}|M/OE8a_=SA+wD=4'n`~'Dh,gCr9s!E -WU/~9j-{uF:'fZF57DYI[Zq+o.Ao#(.r*nl 03r7ZoR_Cj;sxkIuprAW;5gnJyxno| K/[ZS|; ]~X"{P>QL2HwT6}/>qEUc'5kiLgPn1 82Z'gkNV|2sGHo|2|B$jw^ dF?,zGO~QF+k&GN#1|"^+czu\9|d% |(< ChSs1Z;'8G~J A~E[d({ E3EB5ccRy3{?!mx^y;!%epy 8BF ex8KJ;$!+h]Sv`1^%')#MCP+8 vf  =q55** 5)A(IA" (M$5Lpk$3"|zG9aQ97u(/azKku=zTK6GDoQ/5P3t<TQE _$,'saVDdb}~rib AC;z"Vk8iE0f~|aM3XnvrIO]2Yw><7NlmL:vC~tC^*=a_N92#_}Ar')yEwlkZY^h Tt=6l;\Dc{=-YBS>TpF}@ Lg#p:X7tT*yn76UfyhiQ=" & U1_ kNLg(!:qvV[JF.) K'`Jhj[2}-B(T,8@x22pjBz6r5~_oVRC{]-$:t]V7tz)CHLEk{mlw{y$oHl}+,4i\yZ/4B0-%r7+nqlacpQRSo2V=~3{/S o|)Z #J oV Ztv#\:uP%Q?[U pJ! Z,*SX.[=$|-K<( 5i2>4G! ri? b&(`Np*)_Em14 s}x@aVN\|7I:`_/:sQ=01pb!+'ci'|G&vb%SJ@S%^tNi {P%xT8ZHMe #-htTYQ !A:OL9R$&8HK Ac?0lR\U]0EnFLjEtlP2&|,*5%JU6l(XN,. ; V\%M>NMX> ?yN~u' #sebRr`L}%tI' WhWg+i$ ljDx,f>B5=0XV@J4+3em_`e08"UCeaJ<@"2W h>cEH:_-GRktD/@5 z|>vo%dx&#zY,MV1v/^ z-;T`XN8;:[]QlN~w69 t7D'g0m,#~B- N.OAea}*NmO`_g8xvb2Mo%8K]>}}I^gvNBEQvxY|&=w#2D1*KfP c!($n@ N&IN]rk7^z2N?.T _i6l3<@(NDQcMKloYI[wZ)mV$betgvuH.`$eS|NS QJhsZHoftb4 ZW/OH3.7M9?2nC! !(lBi{LCN6OQgfvVh]mKPr6}bDM7bEnpE 6'^tm JWz}NzCB3Aswn /qW|  YQTWGj}reOzTsIJx- aJ"qe|B F^/9;Vof d%NduK/%bmdI<+-+x7aOEhEt=W?zH!{W^G8&Z- ;)_L%;?}lIto!y:eH${prd \|Oh"d`ByO&lE(\s~&d87> *:AhM*F7 OT2|iaO!s~q~ ?;%x@%"s{B]59*=% m]2.m8R^>#Z@a=K.jw,}Q=q.4qdWxz7NSqy3f- iDOHUTh4$XxD{ux_@/(1=SIS?~%^@ `n 'NYlp? k-R+SK[ibD<5*J Q>nWh-ObRD.q v}hXGt&cT8xS^`"q{T Fvud)p#dk>]La*92D]7n$>mo, 6 cbiEL hgtM}ax` 61,jE$ 4en0\\ :v6a3Sdx*}!  IL7o a:w};]gP_f,mo3 KaUU Ol2^45U h%osjzad~7wfo_ +>R{]-9:ct FvsGk&|f~y1t61|G ovwg.P!u!oWD-cT1f-5*7d ,;13%2 R:/ pu&[B33(+SBD Evx? qq;8 4t[#cz;qo;_6h6bskK27(DOc&wo=, >$6!#K~SDWa-Uu{v&R +T2(NLD,,h~3jEhJ W%;Nw`7c}H;B>7 ?cmJ FC-j%Hl"* WgM7yHXcK\ wL i8T}=N9 if_E)VZ n [U{tY`b QH3v.n]F9Fd!#Sn]}Ku+#JT[*u8 rM9]_e0xFNUB7h?Xp8{dkM#XM)PgA9H' Zix VQUSCXu6IBBbZ/C]n %r 6}dPubhBd]Ly=;w!8Cob(it7A;gKu r n W}l)2*w(#c)`QDt;X}!]GI@D*j ir'tgqq@{R`%9}_ P V&l_t(MVsbp+- Vi1YK]Kt 8`V[@u+/:PVAaI~ WU P!UL>cFvI#0?2m<06Nx2]P$SuKldOS'K?2Y2t^!%"; &{j#\oJ)zv@\O oh)|O,#^>W9}2#HCxn3 WFeu5ym.h n%@Tu0Ule_?GI}.mtl~mau/vxh'U B'=E>G__G^-f!G2hd~q{{x/ RT_*:7GEKp C}oF??#So ]GyX~~2btMlo'Oa(xA&fqQvs|ic&xh. lqg^{^#U +*t 9mdry}s5owW ?>o_h:F {. 0HzfoD)Ih,ont{/nH;(yb/t>+[5xwndR64U"o"&%MNR{R~i\I#omqF.[`yFZ\) cAh;v Sk-@JUQbQ%{eADZ1\H{0gMvUv{H~4lx&Nx7x (o/z;w ND@1.@1B#(,ob[n^'- c,TJD gF H"Of:}01Y`=#OZ0Bt[cV%ml_/)edzezqcTypIHRl|`j sk[D#c#Tqh4LvK1^ :>/Z k5U_\UQ scznALjdM&IX-J W }(WTd 7H9PT`J4x2EFzG!T%$h"4k/A|!#lxufbzo,xx]i)L@cMTx >ul|6?GJjQ7NgLwY}>)2}Q12P {aK S~gcbUI8ImeO2*ghE2O/le1p)lqL.0 < 'e4uw{$|g]Hm'3|:+,6| '^~C`nz3Cmr{|9'yq2Q_s D3|vC;x!X Z.fW%W%[IG[F/#}^>%[K{[8}yPNN w{x;&N~8jXAy)&]3CPhxKFvp:7 >SXRa|GeLCTITXdM%@ocZP/k`[HemZi_]d@Q'yALM-IeH+Il)Rz`(io=W; (WO@Ko Zg_paD, g](;y!Y Li23 V"gs:}$0PYTLGCMFpXCor`gd=R+ f+;Q~5eWD:tX/90nv' >%e! `dJ(}v=X. t"%G;);/ F@;P|;RdWB(Avt gzj,j]:XRbvw8q:7ym4]R1a(iA, ,[0zuY| L0Xs P^hBNRP}4hsvzqrS5yLWxIrdd'Zc)@4 /'cQX@q|w|e|[sJJ )" PJ3L,-nq-F\b;]fF!uH.)X:K8lt)/rm)(L+2L![AB_o$OUYAR8?|N|1QVJn5-jB)[~(;doIe V=yXj8#XcNlO' e(_ ~9n8~AW~}DNc!<>?|oYzOos@&VBmZQ(dY]q^P H#L,^ID2)kp6>OzDAqtZEp 8z@T(?($H;1v Q'bi>|"'4_$H#X2&0Ii AVzY%96$$bdm7dTF. 14zaeY}2dclT[[@Uk0 FmEN7*DuY{ t' 0*7R60?6-X[z%L99 GZl 2`r_ZMu>THPNjz%@#)DXgfOhIK;s.N#[ C9 ^NdLlES y LET@;$xJk4Mt\[ kXIN40,'[R n]Cy&,u@F0z wXK'1{,\2l`! /IA^c f*W[e[ 9{@;$*xF mx1_Xz ^)HDK/0i1.Q&(|4r~L_|1s#$,z@ "oe3l]Ve!enu.70c_iBVW CNp${A!HhJ>mQmpUGuV%{GADBAe.jriq?{$~OByyB.f.LdZ"j} ^I0:m`L;]%IfPGSh^1 3 +TeqJ9 Ko\VdC4+7!87d~\Sf7+) (WrA\v{;X^U."G/H6F Kt>X6wBqCne2>Yspu4>(-tgs:i:X]h*y:rs,sSSo//0COQ[Z]t<|&]5zaLPQqf drq[<=WAQ-hG!z-U|<Jk:HYO1e8PgEq&}A_l:**KF3j]Y-!SZL-rT8E=fHllK2L%N-Y99Oh)Zf%kgvR0"]Um]e+.CPm I6W$JTb`Km^K~ I!n=~M&w0)N\,/z= ;8q-<{feU~+q &v":;yUFpxn'd@J1>/( c8KhZQ| dE4&'h7Kl M=`ZtwXxT32]r?\&q +N909eq D5eI228S# ,!ZyvC{^omBh/+8FMS")5@HC?r+a%U 7g22q,nn2Wf#[g dp+tV 4Z*gk0Yqx2]nS&VPOwsI> 2ws94mf|=^$m<;Sh8 6 A:V Tscui;1&M2.Y >,y[Xi7mc)3@6JD_ !-40:73:#h|/o,gk_=4rZpaQ<2X+7}h6y/G hiH:{@LsL.s/0dDmI8j{I+d p-q;aq ~,c1!H%6A"{>ewAm\>HP01^!SZD) jd2 taTJ&,SC,1s9n8 5|JPQ=2I2$bm.LZT=)o  mWM>3^] dmR??BNX(}G4h!Tl o~h4RG=6-8!8khO&T0"1e#*Zi2axyNtZ -/`>Az yvaN-4x~{YF~f +`t_B6}/91e}~Wy| #9<7PT+)T;}h)n2 Da*2XG>C?}Y PYWPQ#z*kW!nMP8?5.-u2Bdka6o^PO`k7t:AALfA:PBM;BluSN;#Sl}hYa'aoY3a> jYO20AZp=Tw^|sV#uL7-(9Jl=,'56:;o-Ip-*!*`.3)b,oz\wOF;N"j,-@JK\Mc8>/8 4@8/3MOsWMlQ/N!9VS" PBN>xU"[9 |br1+AL;%1II9S>7eK +;]E dzUU9-`JtP-uS cVBDW~Rn)}7H/ wWE e db^]bN_R]GXL@XJbv{/Aq|Bjz/@ntt6"eb"cwhWS,B> ]e&mf?<[. 4?-.r>nd7 h=dWml_~6`-B+Vq*u!e&z6ds` Q7mq0iwh| ):},NPr:RY&&N!haN#6DS_ClqRR1>*&uY~KytJo8xyrod n`(tnfk0/i6+9{t=NG,}821: xS"X^Ix>I;A}f|x<t*2$f1e%rP< rZ-j hKxb*:F HJtwoT'ZS?&>Y0ej oFTP@'f\$b ~=J[D&30q_SAi-`/>qI&oR1cH/IfZL-@YTkR]Z%JdBL{Fi[LzhG%) SH#H NLC\PECjgjzF?t"ejl/ RbgA h.G NB#r#=IBaR,WC/@}K ,kIpE~kUiiaHI)X|D@tK~C^|'qW|6#E6;K{![=/>5ze:exY{Us/7mlz*h$w"yiHXU2abF+TS2~SI7~_XsqO kWt[[7%xB/Eq(04%DO!7 wNVf5K6B( ] FFATU-Y';Fy(Cu!O*mr($ 8w`c^qd%'f8r|m:M\#t=&x;N+R K+Z>ILV6&BosJIl;,7s?brt.R<`abE? RMY_?>@bCsN Z#lsrR9ky& $Q*.s= M5$}{?ei_19C7|68{gRB5q.;w/T{r{g ?Q:f8:g^1~>Wn `""v&9c2f_fG=#!N9To)OL/c8WnqwMv.O: @8l| &mU[IAJrcd Yn.IUS)"-:Lg]Ot7E1\5Qh_Gi<*@\m6Ak3I\+nY\Lq*(6-re:9\q T"&UvZE5|.0SifPJ!2G, f}B[H>=c6v[Hj]wk7o+YW&B:}%xYnVpK4OD`NYWJR@c=,\Tbj-]Wb+Wh(6=Zc.+M[?j$aq%56qzo)*lxq|SVDCtYebLn[G[1yNB%K1v'{[rt6BXM is3>ac|9f8o=@\0_-k |hv13R `hm6[I ?e'8n]}v^Qw~+b}xF0<9|~7uPa:7%x6$ (8h[Tgp5J L(D;p l\gc,Q+Y@bP2W3:p3H^cU5<>aWZC?`Q).nDmJx(i&|@}N/_4%GwiIq#m IL=\qU5Q>xn0Z&!UYn$aNs90fTSawoo<7 G}XT Wq&^bA|hB:{WQb$SMU=?d nCn[DBg2Qv}=80:=%z:>NjmdKHm{CD pHN]O&YB9)+l`,*be;YSiR0%nH b-\<'yFZ]dN[H+*e u;b&x)$.\S1[iad(YSRX-Le|`'7sXp`a:b<2{@jPb`w:Bw{5N3,Oj6d3aBWx 3y~-AuQa+/*p@!9: |P ^Co2uu^APyZq"ubj?p1s8vnjjBBc M~ϿxQZc>Q)E J1n /aL4/!nv-t G= p49t];D_W_@Uc9{) S89_:c'H;d_' ;AL4p|a!1f|=~M 4 gKm] LEP]K .Y HHi) pec2%g d?#DgdRI|vh@ ini8'xMB+L<<}-6oMCxwMh55]#o -chRE:fk[*.scsW'xsPE<T(|SqbkpkaE\^ip Yb'VKG+SfpdrQ VJV_TSJ&d*Tl94_Nqd8^ d7!oMU oMU_F] vqRPF d!6#8Ur%, W+QqCV5,}OI@3*:1p=m; ;]v2H[fJgq6+Y <0aY{/)9tWLi5<$vz@P#jŝRGbPK_LE_7i@WA#iFW~y.QO0B`NVW3,#@LCY4,ywyml\$":3? V}rF|BEwG mitJL"2WA{|zhn$c]nrcVP]6+ti:6y=+;ls_rk#X Tq'Nw7yk:|lNxpWk<9Z /96}v>i^[{r x G, NIXPdF0A; @}YgLk\lM' 5M'zym-'htV:6V^G108Qo3NBQpi7 ~P J*Fu"%o<15vS7TSLE_Z<&_|fxIbrALO8KgQ0FQhSfhmqpj/.`5iix] e{!e,=}w)<]MJOYq,)%+k9x";["xj\Cx'#H8f#rO4VS7kqlw"? "h-y]=8 i55_9U9)A-t97.7f\O[bwf`FG]%=q\p&+iaW:=9;k?pBn{s2hS&~%V$'ye/'HB!3L >Ao%.x`GC8dNj!da@Y\D/) xf ;j A8om /(8Vnv&`V>@b0KjcikAP0&u5x/D0tC.N{5M=o26IS' rHub^& guf+r`WMfKW[E{xswAEqM%WXi+<jI7npU g'f=;&aO7zUSFm>dVjTcZn9==UHe PeF[lb$lWG\l*\!I7c WrNem ^xm;:_%'QO??m> sy'PM+ 4&c/w_ZG &xr 8/.r4!>O4:$"c1G"Ik=" =%BZ~qO(Ob@`{.v0rbBN:\jU\+Z*_D. #Jg@[gOb~Tx4HK86q+6}DL3GTB+vCDHAQO:6VDF1_mbxLLVn0GO`c%y-<{2u.SBA$Ev.(P%+yW0"6hr:)KHv~FuP:S'h_#F:!@i7 sVN!q%GZ@YHK.o$0^z=h} +sv7&} #KMuJo(Mm$yFV#Mb q[rX>sA \m7$e; `003u#%a\-hOK%-st6 D]bj{bhXkSu]klxG'/1~fcw0 ylx,n0Jx|b|c)]TWBc?v3j^oa=1Nc_E'1VG:`u>eCEk}4 W)o^/K7$LJ]KED{Q3oMH\?]6k g4W|^+*CT\E<$dJn,(=QEo/1wl30/4cAmkb>q`' PYX0y3t#QZVnmxdK\D`W PfRc*ByBDHDgGZ\a{HjGeiT NmfkT?Y`'6lRxOu|W`A5 [&1))w+ Y1/TZP:[b([A-.8>_jCc -6@Wb/H!:R[J%BcA`pH3^ac.Cu#vPFQJ#95C8@ykq35NKT@ AEg&`XQ4@BwhIB{Y <x[ Kd Qle zTJAL)L6E_l[xh3e#, J!ia#":/KVp=A8YJ/?*]a {/S6|MSJAM|#^L^GHJS`I^kL G9$MM ^a7 NlM@P?o1G"S]; ZoM?`06BAR5FKFoIxky;Tn{o+*A(f99"/=K+_qOCug9"]<'gj?n"Ry[OX%Rd't9fyNl#5RD!]) q|6,{J],Q,Gl_[P}@z^3M2YuT~d W"yu(Y _d H54UG^ nA}r*k;Du[7.j87QW_Wu[IRhk5D4Gc#"!0DZw<>$}I]KE/`W n2hMG_yrd)imOu"QQ{KE>i$4Um2IYIDPx~g.%]^P1}"yQ{n5{`1 /:f11-7%h2 j' $9? 'ZMrdRDpNNH @3$MV8+d&0* ('(:@<-j#=}wDtk} !Y_KL:IJDEI&`ac != AxiLbg{]HNT:Yf{b}qpq,|n<}.zcTh7W1Ll:!.6!=c^3 ycU+2jGJAA]3hDf; 0WK5= NJ*)fa#AT"7=b!<-%E5/'ITKJ[w=%1*Jpsi"o|Y]Bhj{n*@6=.<>& [8^qc:BOE06GG ^MDyJQd.i:I *0uLvycU+y4~v)>Z;~!7pQ!6]YPLYL; JJ+gq"2zffE5e&XEOUysA_#~he49++:P#X2Jvk(ax 7`ch4=&,*(|oC3$>aK].(oW;j3Yhx0@ipMa/fG!m6xX}B57jV=4h&&W0/eo,Z|bbVjY)H2LeH0U`83\ !jBgZIMQl<' ;B! 4#(\}#cs=a~+b4HG"2-"|ct&Ev:`a@c#Fuw7MH jC)bsw^Z kAx T/=#_P?z1m<a>]EQXal_| 8EWU/eF;%P7"E"{V,J"{_0?Aei r}c!Clh
    Q`Roz7-8[9QM cEpKk:12e0bxign/'o:8bU 8AKy,xq@Qn$ ;n1!n b-PW1/N@MRh3n8(;Yjg*FgT?E[_ ![5lE(+7G@7v^\M:`~Ay'|/6s+: g%kuyLfbHINRDOofnAaWhfHR#LB6Ck>4De'ut:`T~D"}$${,PfT)^FQ]*'"{l7;)*c`e S ^VE:tIR?4hfQ{<(;gB<^m0 6#A{]G"|'|]5OAF8`!a6b{{c$[roC;\3:;ViRXWo`d"'r}:j^'o,y>f$;)SM=(@/f}79U(L'")#[IV{5UXk|tXHjt2SEK";cU=&"o /st1zp-rB>ySbu*ZAOnA,,_{D(G#VS [XZ#\:C[A]rvF|Xy7mky@bm3Y-Lt@rLQ E BYww-Dh2|wu tp'9~~t0-Q`- W_jhCR~o&e)p;>Q< h`!P k &<s?sp,'7Wi7<"m\]-l:^#;9O-R20O64.{NR:6nFn)N Dww9iVAEo9_]R!u`p(Kwb"r^7t)Q'4Hv!0i,_XaJ64y+gNHE< ip5X2so%EHBM>J(k\p$u,rTuB> '4= Zc}vGr]_ZOO4"q_4Wr;P yMdp.N[Y-WnDNG*to.U9EADFLv,M]y{"QP]O5<^iE^NK1ne" dV!=<G"vmrmiJ!T*rUK 4^-9DMQj"YL -@/4d! 8bMms8%"U2 #=,6?k4 MT|(f, [ G 8y5bBS/WMB{uwZ@,vzn&s pm!lOE9^7; )o.oTN/! ukP)[N xt.RwnoCt"bJ\RM5| uY1:-F~L E !)'LrBCj5tKP.LbG}.93aq! bUkx`/bEpC+h^w,wzj(fM4;QCo8f.a s)RRJ@0+F4 @tQ7jnq Z(^*YVz}Kk*D7mf7~w"M99=0'EK>dQ;KP6[cUlk"e~6 c]Aj).w>HCu03#1 JL9l$'7~M{ZONF^ZYwr2R{}k+IKlN !f^?/: r|i5?j2N NN4~&s@PJ-6% '@ iLJS=NFRac WMuYri+D1DL:/Z}|.EOg-%D-(*0Q(='%ofp0|A-4JIE?|rx/M9`o XS8+)5@7E[NB 9*wO1&2\"R6tD'l ,I5<2vc>nf:cQ-63JHF@<)-/g13n7*L^oHw[\R B|R.!a6eP?/ixx!B5&flzT?[y^2JoB}6C3Y~}[*W U b%/ZF.nbz*U!~z+5.4t_Iqsw@t.#U N,.p1+%h#KOG"Q0-$j"2$L_C;78ve;,1Zf|{MwzSIS3I=W<%GVM5PD^Su[CM oskAd|"dz\@~qCEiI` ]wf4rr9OeK7=`vOtGj3Lmd#;g|=6;k/8Gg6*3aY*g Z ?;2!B.D;.0` kF>-\tL`g %0 qdJodyb`_^ MIY>DJe_#Pl(O)N?Zlw1 I0A'{71ao,mW44-9LPC]w3"24Nj+#Fs2U6q;:`U&` i9J!k =i'\ZZ^90$=.GY |J T[MxvQ?tDC81]Tx95$]WPq3Is>Uyuf WG4`;s:j5.) *L\5 IqH*{yOJ4>k,V :9r3F _+Ot0OUGjKuY#4;)&Yo"l9cP6@[#iWT;2-e\ aarE*K1,7xt)GJ|F6` \f orcUg0GLECQ X`bZ  dzsPb#3ad:-9 HF:Xn1@6T;K|#7!?y3NSMNE!o}R, `V/a73 :dYRO3hk Rsn> d>4h/ei-|81 NU8;*{1,p7IEvL`VT3TDx_xy*EdcRkvb*GUuBKWOVCO zlNOrxV`ixgq}L^}F#c#J 0|+fP(5G 3VrdGZ GJ1-s M'n5nlwvhr}uTW,#6C7e9z=, W9[!z+M$.3uUU;QoF}6'"E\b!iSJFBe/,n lr]5HU?^j T$55nJ,Tst9|}2xWJpWRsnFe: _&}"@fhf~dZ:>a#F19D3DD`3$}wWN,lJ, &*N%pn@$,+Omx!W@AQ|!a[H9/):I&x.JRO+,( 881#!'Xn'rG%CZ)4^SsH^|> !WFqB 35hXo50'3Zy|HGM"BD}B 'N]!'[mWj#L4N02)% ?&s^KBD>rbKAf}X,s]auL#wHY[=Kg!}[ +51mRYu"K P/v `xe [W_ Cm=onc0H6UME$ \VCD%oMU@ )'sytqv@El}80 ]B9H1neN\G@^Nbj`V*]x"}b4 sqEv<`k;%z#eycK7P>Ey0 M:nZBA\EIRfu A%SA{x CF'V#g|fo(#mm)cEgDK* 19N#-7 tAv( A~I='ldG60h- ;`@vW/ RGw$& g},k5f5nH55>!}X)0vQ{X cc:yBI~5Ue`F AF=Tv(s/}gWx@Wu*RHS  :{yjaUetHUmBK|HgY'v"25tW.3yw&e@#COR_V*zp8N[6k) 1t)1`VPj+8=qY?YO&e\I8TX [SCMCH?=6|0\!x!+&p:XQn %?P@Ua6;4kzU QrEfm~hMia #Qp[XXz)#*b>&P w{1Z7/p{- xuM4,fRF`c9&f:$>\/y+u0^" h ,8zS,'(VQJO]2r$V&: iX1zWK|d}bxFjaq263'?<{%?&^]f[]Ainr$c:qvZ@/M kPI#(W\hwI= 0^[ReKKg@@ ^1j?e+!q]u LOm+yJ0=)o0aa' (v0! Ke n iDt ze3d9.%AlV1NDw 35@m wyuB}|,&*5-X 6g5*6:>5#a;o/|l%Mlx,:[i-Mze<3m!c<lUWC+# r;] )`B_3/!*2[}>u f,2La!A^ ^)54")z/) " >|O"ow+3u|b a\z}?GI#gnPEY8twMn7fQf |i-;G7wCa4 s%}Fr 7Ocg)rj.%W-& \t;lSZ|r!bSGPqJ*)Qt*,BVQ@c5DV^6IuOYGUQQa^I DokrvE =1pXBypnw&q=: Yy+*[G Gz "=YP`vk=!.?#g,E0?2N cv`uFz7'oNREyUeoy=yU"e% 0V@QtoJCBl9[5-Mb*(d-1F`fSfSv-,r `n ^sw2n IVGv>?aNXd;=ig9@br72o)f}jRCT2^sO8w1$<->45{[=/,nD|6%3 NRd(+NwVgQW*  g"VxK1 mnRpoD9_ v:s+X o7<2)%4 /{?I[(s`<QkxE1 7#8NhtpGxK M'A9m ,UN7xy5p2>=SmP$u*o<~\+  Db#:2x  A_+Rs(Fd@MA%j!;/R-RuFHB> XH"C4mv I i7q$NO}UV,<*.;}yira Q:[~MXi?1  T!@sz:x)2 i&f5K{d 68~={@EG?XH(Elt=3<Pt/8[#IDDu5`ga =# ^;)#gSwX 83RUhQwJ6txS) 6ojhq8f;MK Xx@b!!ruJQr^W;G 4WU]%]Oij\f,*^_WI,HDahCE /~YW,m1_e$?}ht|Kc&(yr(4]'+h8k!WyO~cnS84WEwAL*KBS(AQ _e3?$ze:#+::;zi_o# a8# yD)9Vy Dr 0uH7@8"c1}+ (_n27__>"\Rt[4/MOx{f-/\`\Bb"5g+- 4%y ^>~U@ Z[[ oaRQvD2 5|}]__I&?n{*sEDTIcUd|.[{V"ca [#yc9b`9*ld$qdu9`O+9*WOUx_Z~\g(+k T=u<@Ntb&5xjkezRpxb~dE/r)^~akv0q78X[ EK`cEQ?z_O,xq$Kg ^$ g\HH^I3Y-${n x =yh(gov)`}pfbk!kJ`*=5:MSMv#9[{)e;2/?9$%svs;ex6X|TQ/05_\d~_sKxHxhhrp ;W ba*#]99 ,jdaEL 9H2z}XG,L/KN 0z@!;P76THf?/P^/kYKI&s"a=b~ ]pxqqd\]C(wZpmk-v}|@FB'=i,)4p\:F?\85+69GAD .Uvvk0>wX+O.BQ \uk0 TRT?~"XI| D@^ k]mdagcqfTsIMsYX1;`VWd\C cS^[_->%N^ YR_n" HOW I}OR/HO /*bV+rD4>#,<0j+jF-np^L~y@3S2 cvpouW}J0!Fbax*MF 8i!ntSGwz /W\F65I 8ZOj}#/I1,r3krZ- |GL_:RU}JAXPM.Am #B5wRa(v-3?Q2+4yuFwCy]OY@H qRF)8{`=*c/\18p6u3@ngdo f'n)o6.T:Q8J~4 &yJc_|Ph')>LQ+|me&yG{*"4zp ";GYK:-`r'y*:x*c S:OM`aD]'`.@WK0_k3'?%+D# ?9?~a{ ULPH @yGH?)-}.89qUd qO E3Y;Igc)x\h& #2 .7,=AB{5uSZ+'PlY/zC?y2 O&rFmj=vWy9;t&D^4LMng.|ci6r^Uu{gY~)!'x)lzQ4Obh"_6S<0tvh _{LU<^^VyQvH.q%+?Jak9a(27; PG,a.dYGivqht x Q64 PP|I:`NdSlN6cLT`MTZa}D 7^[]_s 7&YYcau 0IPOFZ RDz T9.geQT$!A&^GW^r)ynhq;-Dtc{ >%;`lSsqe;>Y-DNT Y }9ee<9zb./(#[}hD@VdDP5FHN;3&$K* kDr%llaD_ ta[Ii_tv~,p#J %5;+J2k#+Frsg[h6 ;,#UxCh-4vB}?h!8BFFan 0"-aQj,9p  #*WG p7Uw=2Ac5lsx>ws9tOrw `X"fm:\*5"% Q7:z#M /-e[)uR/#5":O,wC^rR~$V2yxF>(f*yMQ+J^_-qLRR~=hssn4Z.u~542siK4GW0w<`%A0QAP6[SIvq2c}}XP|~bJ.Tpo 4mo?,|*<YK!fr0aZ~R TRk/P M*=/cjW1_[25!yc: n,Rm<@(*TY!WGmV&lsrY:Fw{#*_bVa{KU-/ %v*32Dn{i.y{2E|uX N{lOVA*6Izz0 58dM,oKD"Fj}h!R<=E/s|r %dc?QDCF\H"DI0B%;kl;Ur0,_n?zv]~kl3ZO\,S]c@l_ loptXXXqFKr|g6 AFKgHV]vBjfhFe{VM*2$u2DlQs^ ^sll6lwB6$]u-:u}{nH:AuOOIL8nhIMXZs|tn'kz, |}$ *v)>E_(,o2Y#\''pWB"*QDGnO!Vxmj0hCi" c0M(+W\>iDov Uu`\%}JMQ0@ >[#RP@/T{{tcORGrh^CVE=fLPCWOiJvcw`~5]i:)H iPY Hm[]&>Rcbj[\/ e1.M> n ?HH7YM_\gVTwr4NI* `+yp<*3!l*%6g &+>_wet'2H*7q:{ [f!#q]Wu=~q Q&>vpwADV,(Zb3] spowqFl:])_jck-v0Qnkg$s\{ozX==VRG_"tO''Vj+ppfo(,0e 8]7/uw!1T7PwTu ;(@{w8TXbgin>RAEu7?28i,yPG(V-$o+ G![_dY)]8W LP]g}#3%oP>4T'E|q|#xtqv[S[8T!pwtM3+L3Z .xJnj+,a3VP5TVu_H!/YEG %H;%U`}*N&T,)jui i3HLi6lS;tm^:U&G@Z9@Rns]RmiwYyQ L{)^,=Kq_1!F1T&YFjR ]`hT~W \&oL`E  yKC4(CUJI{%BvCZ)yM[10'L_!h9~PD5vlz>Vhh=u>Y2M@MY: ;*||Ejt4=a:|W Q]UV-9M$Z.bC!' {'Z _v/?<qwAhNvW?4bLl  B @* e}:[%lCOIME,&"6X9a66b}i~`$G%'a^"@PBT~ElW5 L,Bm>"_L)J {.l!:Z0ym.;5gZ=G^.waD9 P+nHA}2c2Jtl$EA?>s}K z;P ~mMAz=w[n6P:nVm&;Sd&?y#71/reZ\G\po`>ar%XNLOg &;L)DHYM* NN4Zyt($@iu1a S=2D@PnD1hzj\V^X{FU(PM>gF`Xy)i~-H6WX$-Tc<@Mh`blf73"< zv}t\zf3!%Xa1F-ae!:~Op7~vO{=d~uHSBsHdY2=)%[|U,Za wx&u`+i/ |eQGCo>`E%bQ ~>}NyTx-}b'IqsjyJWxes-&;/jkB]Nuu=6ieB bhFe#1x1f`'j40tS DI|J${Uc"g3GN A^0 !6d0G< H^ # $LA.W/z:fT?tX_B`4^6fT$VG((wGo_k&?Ma- "*}rSn" M JDp*>EAu^sTIWLVCquE= Y4GE'LO& !dxu_9ucl?c#e\os~h%m0N2@;,U r"cwwyed2:WM/YBEPMtfq|zmdPYBEP3tf@f*am~]]@H a0'~fID{0M40-vnmMwoXdd_prow-20$_ .word gsd_idc-20$ .word gsd_env-20$ .word gsd_lsy-20$ .word