signals - 英特尔 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_FORTRAN
和NO_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。
解决方案
推荐阅读
- javascript - 摩卡单元测试:超时后如何强制停止执行测试
- python - 处理字符串中的单引号
- haskell - 如何使用 Amazonka 获取签名的 put 对象 url
- html - 为什么在 Firefox 中默认禁用“对话框”元素?
- python - 无法在python中删除换行符
- java - 将整个 ComboBox 放在 TableView 列中
- java - 如何在我的代码中初始化询问管理员的模式?
- java - 与 ZoneId 的偏移量错误?
- python - 如何制作数字字符串的条件切片并将其替换为另一个数字字符串值?
- javascript - 在两个日期之间循环。开始和结束日期(Fetch API)