R. *_*. N 0 fortran gfortran sigfpe
我正在研究一个大型的fortran代码,在使用快速选项进行编译之前(为了对大型数据库进行测试),我通常使用"warnings"选项进行编译,以便检测并回溯所有问题.
因此gfortran -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow -Wall -fcheck=all -ftrapv -g2编译时,我收到以下错误:
Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.
Backtrace for this error:
#0 0x7fec64cdfef7 in ???
#1 0x7fec64cdf12d in ???
#2 0x7fec6440e4af in ???
#3 0x7fec64a200b4 in ???
#4 0x7fec649dc5ce in ???
#5 0x4cf93a in __f_mod_MOD
at /f_mod.f90:132
#6 0x407d55 in main_loop_
at main.f90:419
#7 0x40cf5c in main_prog
at main.f90:180
#8 0x40d5d3 in main
at main.f90:68
Run Code Online (Sandbox Code Playgroud)
代码f_mod.f90:132的部分包含一个where循环:
! Compute s parameter
do i = 1, Imax
where (dprim .ne. 1.0)
s(:,:,:, :) = s(:,:,:, :) +vprim(:,:,:, i,:)*dprim(:,:,:, :)*dprim(:,:,:, :)/(1.0 -dprim(:,:,:, :))
endwhere
enddo
Run Code Online (Sandbox Code Playgroud)
但我在这里没有看到任何错误.所有其他位置都是通向此部分的子程序的调用.当然,由于它是一个SIGFPE错误,我在编译时必须在执行时遇到问题gfortran -g1.(我在linux上使用gfortran 6.4.0)
此外,随着代码完全不同部分的修改,此错误出现并消失.因此,问题来自于这个循环?或者从其他地方和回溯是错误的?如果是这样的话怎么能找到这个错误?
编辑:
因为,我无法在最小的例子中重现这个错误(它们正在工作),我认为问题出现在其他地方.但是如何在大型代码中找到问题呢?
小智 5
当代码使用SIGFPE死亡时,请使用每个可能的陷阱来了解它是FE_DIVBYZERO,FE_INVALID,FE_OVERFLOW还是FE_UNDERFLOW.如果是下溢,请将掩码更改为"1 - dprim .ne".0' .
PS:当可以使用整个数组引用时,不要使用数组段表示法.
PPS:你可能想在do-loop之外计算dprim*drpim /(1-dprim),因为它是循环不变量.