我接受了这个问题Gfortran does not tell me what sort of FPE it is的评论中给出的建议,即启动GDB,为该行设置断点并检查操作的值。一开始,我的程序基于Fortran 77代码(我计划在运行此"测试用例"理想主义的CFD数据测试后将其迁移到F90)并在Ubuntu 16.04 LTS上使用NetCDF共享库。我使用gfortran 4.8.5编译器(如果需要可以升级到5.x)。
这是程序编译的方式
gfortran -Wall -O0 -c -g -fbacktrace -ffpe-trap=invalid,denormal,zero,overflow,underflow ${tool}.f ${ncdf_incs}
现在我在程序所在的目录中启动了gdb,然后输入了
break inv_cart.f:1221
这是FPE发生的地方(除以零错误)。当我这样做时,我收到了这条消息 -
Make breakpoint based on future shared library load (y/n) ?
所以我搜索了这个问题,我之前得到了这个Q / A - How to set breakpoints with shared libraries 这就是我做的事情
set breakpoint pending on
break inv_cart.f:1221
更新
我有疏忽。运行休息后,我收到此错误消息
No symbol table is loaded. Use the "file" command
Breakpoint 1 (inv_cart.f:1221) is pending.
END UPDATE
执行此操作后,我得到的错误是我在gdb中运行inv_cart时所得到的错误,或者是独立的错误。
Program received signal SIGFPE - arithmetic exception
后跟一个内存地址和几个问号后跟()。 所以我退出gdb然后它告诉我有一个仍在激活的调试会话。
所以我的问题仍然存在 - 如何获取FPE发生的值?
答案 0 :(得分:1)
在我发现更新后,这是一个直截了当的问题。
我查了一下这个问题 - gdb no symbol table is loaded 然后我继续做了这个
gapminder
filter(continent == "Asia")
group_by(year)
summarise(mean_pop = mean(pop))
最后加载了符号表,令我高兴的是,我通过gdb再次运行程序,并能够打印FPE发生的代码段的值。