首页 > 解决方案 > 英特尔 Fortran:如何在 f2py 包装的代码中获取浮点异常的回溯

问题描述

我有一个简单的测试程序,它实现了一个函数 ,INV它只计算 1/x。为参数 x 传递 0 会触发零除错误。当我使用 ifort(版本 2021.3.0)编译它并使用标志/fpe-all:0 /traceback/fp:strict /debug 并运行它时,我得到如下回溯:

forrtl: error (73): floating divide by zero
Image              PC                Routine            Line        Source
ifort-tst.exe      00007FF7EB0411F0  F_mp_INV                    9  f.f
ifort-tst.exe      00007FF7EB0410A2  MAIN__                      8  tst.f

在我的实际应用程序中,我们从 Python 进程调用 Fortran 代码,使用f2py. 通过一些修补(必须定义宏UPPERCASE_FORTRANNO_APPEND_FORTRAN),我能够编译与 Python 模块相同的代码。当我从 Python 运行它时,零除会导致程序退出但不会产生回溯。如果我不设置/fpe-all:0模块,则只返回 NaN 而不是中止。我希望程序在浮点异常时中止,但我希望看到当我将代码作为独立可执行文件运行时产生的相同类型的回溯。

我怀疑某些需要的信号处理程序没有注册 - 使用 GNU Fortran,有必要调用一些库初始化函数来使 FPE 异常处理工作(_gfortran_set_options, _gfortran_set_fpe),但我无法在 Intel Fortran 文档中找到等效的。

我正在使用 Windows 10 平台。我已经能够在 Linux 中使用 gfortran 从 f2py 模块获取回溯,但对于 Windows,libbacktrace提供的gcc似乎不可用,这促使我尝试 Intel Fortran。

标签: signalsstack-traceintel-fortrantracebackf2py

解决方案


推荐阅读