Example: Locate an exception (print address) and abort:
demo% cat LocExcHan.F
#include "f77_floatingpoint.h"
EXTERNAL Exhandler
INTEGER Exhandler, i, ieee_handler
REAL r / 14.2 /, s / 0.0 /, t
C Detect division by zero
i = ieee_handler( 'set', 'division', Exhandler )
t = r/s
END
INTEGER FUNCTION Exhandler( sig, sip, uap)
INTEGER sig
STRUCTURE /fault/
INTEGER address
END STRUCTURE
STRUCTURE /siginfo/
INTEGER si_signo
INTEGER si_code
INTEGER si_errno
RECORD /fault/ fault
END STRUCTURE
RECORD /siginfo/ sip
WRITE (*,10) sip.si_signo, sip.si_code, sip.fault.address
10 FORMAT('Signal ',i4,' code ',i4,' at hex address ', Z8 )
CALL abort()
END
demo% f77 -silent -g LocExcHan.F
demo% a.out
Signal 8 code 3 at hex address 11230
abort: called
Abort (core dumped)
demo%
In SPARC V9 environments, replace the INTEGER declarations within each STRUCTURE with INTEGER*8, and the i4 formats with i8.
In most cases, knowing the actual address of the exception is of little use, except with dbx:
demo% dbx a.out
(dbx) stopi at 0x11230 Set breakpoint at address
(2) stopi at &MAIN+0x68
(dbx) run Run program
Running: a.out
(process id 18803)
stopped in MAIN at 0x11230
MAIN+0x68: fdivs %f3, %f2, %f2
(dbx) where Shows the line number of the exception
=>[1] MAIN(), line 7 in "LocExcHan.F"
(dbx) list 7 Displays the source code line
7 t = r/s
(dbx) cont Continue after breakpoint, enter handler routine
Signal 8 code 3 at hex address 11230
abort: called
signal ABRT (Abort) in _kill at 0xef6e18a4
_kill+0x8: bgeu _kill+0x30
Current function is exhandler
24 CALL abort()
(dbx) quit
demo%
Of course, there are easier ways to determine the source line that caused the error. However, this example does serve to show the basics of exception handling.