Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interpreting gfortran error traceback

I'm running a Fortran 77 program written by someone else. I'm using the gfortran compiler (v5.4.0) on Linux (Ubuntu v.16.04). I'm not an experienced user of Fortran, gcc or bash scripting, so I'm struggling here.

When my program finishes running, I get the following message:

Note: The following floating-point exceptions are signalling: IEEE_DENORMAL

I had to look this up - I understand that some of my floating-point numbers need to be stored "denormal", a low-precision form for very small numbers (rather than flushing them to zero). These come from the unstable aerodynamic calculations in the program - I've seen this when doing the calculations longhand. It's unlikely that these denormal quantities are significantly affecting my results, but to try and find out where/why this was happening, I tried compiling with the following error options:

gfortran –g –fbacktrace –ffpe-trap=invalid,zero,overflow,underflow,denormal –O3 –mcmodel=medium –o ../program.exe

The program compiled, but at runtime it crashed and returned:

Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.

Backtrace for this error:
#0  0x7F442F143E08
#1  0x7F442F142F90
#2  0x7F442EA8A4AF
#3  0x4428CF in subroutine2_ at code.f:3601 (discriminator 3)
#4  0x442C3F in subroutine1_ at code.f:3569
#5  0x4489DA in code_ at code.f:428
#6  0x42BdD1 in MAIN__ at main.f:235
Floating point exception (core dumped)

I can interpret these as a hierarchy of calls, working backwards from 6 to 3:

*6. At line 235 of "main.f", there was a problem. [this is a call to "code.f"]

*5. At line 428 of "code.f", there was a problem. [this is a call to "subroutine1" in "code.f"]

*4. At line 3569 of "code.f", in "subroutine1", there was a problem. [this is a call to "subroutine2" in "code.f"]

*3. At line 3601 of "code.f", in "subroutine2", there was a problem. [this is a conditional statement]

if (windspd_2m.ge.5.0) then...

So the DENORMAL error must be occurring in the "then" operations (I haven't included that code because (a) it involves a long, complicated series of dependencies, and (b) I can unravel the math errors, it's the debug errors I'm struggling with).

But for the above errors 2,1,0... I don't know how to interpret these strings of numbers/letters. I also don't know what "discriminator 3" means. I've googled these, but the only resources I've found explain them assuming a higher level of knowledge than I have. Can anyone help me to interpret these error codes, assuming very little pre-existing knowledge of Fortran, gcc, or bash scripting?

like image 546
Keegan Smith Avatar asked Oct 29 '22 01:10

Keegan Smith


1 Answers

The first three stack frames are due to the implementation of backtracing in the GFortran runtime library (libgfortran). The backtrace can't resolve addresses in dynamic libraries symbolically, hence you get just the addresses. If you want to see symbolic output, you can add "-static" to your compile options.

Thus my first guess would be that the error is at code.f:3601, and since 5.0 is a constant it follows that windspd_2m ought to be denormal.

like image 81
janneb Avatar answered Nov 09 '22 12:11

janneb