HP OpenVMS Systemsask the wizard |
The Question is:
Recenttly I wrote TCP/IP server program in C, It is running like what I
would expect. Then I had to convert it to Fortan. But it shows some weird
behaviour. In both program, execution flow and logic even subroutine`s name
are same.
Program is like this
MAIN
CALL SETUP_SERVER
--Set up TCP/IP server by QIO system serv.
CALL CONNECTACCEPT
--When new connection request comes, fires
an AST routine,ACCEPTAST.
--In ACCEPTAST, que a read request from
the newly connected channel by QIO and
AST which is READAST. Then
CALL CONNECTACCEPT again to que another
connection accept.
--In READAST,when data comes, do something
with the data and CALL READDATA to que
another read request from client.
CALL SYS$HIBER
END
STOP
Now in READAST it reads data from the client,
and then sends modified data to the client. Then
When it calls READDATA again to que another read
request program crashes. I don't understand why
it works in C version but not in FORTRAN. I also
did write with same logic a DECnet server in FORTRAN, it runs perfectly. I
used AST rouitenes several times before. The error message is following:
%SYSTEM-F-OPCDEC, opcode reserved to DIGITAL fault at PC=00000512,
PSL=03C00000
%TRACE-F-TRACEBACK, symbolic stack dump follows
module name routine name line rel PC abs PC
00000512
00000512
80287955
80287955
SERVER SERVER 2692 00000039
00004E39
At the line 2692, I have CALL SYS$HIBER
Thanks in advance for your consideration.
The Answer is :
>%SYSTEM-F-OPCDEC, opcode reserved to DIGITAL fault at PC=00000512,
>PSL=03C00000
>%TRACE-F-TRACEBACK, symbolic stack dump follows
>module name routine name line rel PC abs PC
>
> 00000512 00000512
> 80287955 80287955
>SERVER SERVER 2692 00000039 00004E39
>
>At the line 2692, I have CALL SYS$HIBER
It's not a lot to go on, but the OpenVMS Wizard will extract as much as
possible from it...
The OPCDEC error means you've executed a bad instruction at address
512. Since there is no routine name or module name, this suggests the
address is outside any valid routines.
Since line 2692 calls SYS$HIBER, we would expect to see on the stack,
the call frame for SERVER calling SYS$HIBER (which we do at abs PC 4E39)
and for SYS$HIBER being interrupted by the AST dispatch routine (address
80287955), Then your AST routine. Instead we're seeing the (apparently)
invalid address 512. This suggests the possibility that your READDATA
routine is corrupting the return address to READAST in the call frame.
When READDATA exits, your program jumps to junk instructions somewhere
around address 512, resulting in the OPCDEC fault.
To find this type of error, run your server program under DEBUG control
and SET BREAK READDATA. Step through the routine and use the
SHOW STACK 1 command to examine the call frame. It should look
something like this:
DBG> SHOW STACK 1
stack frame 0 (2146353936)
condition handler: 0
SPA: 0
S: 1
mask: ^M<R11>
PSW: 0020 (hexadecimal)
saved AP: 2146353984
saved FP: 2146353964
saved PC: READAST\%LINE 4
saved R11: 1032
Note the saved PC points back to READAST. Each time you STEP through
a line, check the stack again and make sure nothing has changed.
One other possibility is that one of your routines has declared the
AST address incorrectly (perhaps the $QIO in READDATA?). Check all
your arguments carefully, specifically check the ASTADR argument in all
places it is used. In FORTRAN it is critical that the name used as
the ASTADR be declared EXTERNAL. For example:
SUBROUTINE READDATA(CHAN)
IMPLICIT NONE
EXTERNAL READAST,IO$_READVBLK
INTEGER*2 CHAN
...
STATUS=SYS$QIO(,%VAL(CHAN),IO$_READVBLK,IOSB,READAST,ASTPRM,
1 %REF(BUFFER),%VAL(BUFFSIZE),,,,)
...
END
A missing EXTERNAL statement would certainly result in an OPCDEC (or
similar) error. The OpenVMS Wizard suspects the latter explanation
is the most likely.
Also see topic 1661 for discussions of synchronization issues.
|