Fortran Programming Guide

Locating an Exception by Handler

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.