2012-04-18 77 views
2

我使用gfortran的一些代码。一段时间以来,我一直在编译gfortran警告浮点异常

-ffpe-trap=zero,overflow,invalid 

试图追捕一些错误。这会导致我的程序立即停止执行。在某些情况下,FPE可能正常,因此一个标志如下:

-ffpe-warn=zero,overflow,invalid 

将会非常有用。 gfortran(或任何其他编译器)提供这样的东西吗?如果没有,是否有任何解决方法?我目前的想法是创建一个C函数来注册一个信号处理程序来写出警告,但我不知道该怎么做。

+1

这个推定的运行时警告机制将如何工作? – 2012-04-18 13:50:04

+3

gfortran是否提供了(相对较新的)ieee_arithmetic内在模块?如果是这样,那会给你提供你在Fortran中做自己的f-p'错误'陷阱所需的工具。 – 2012-04-18 13:55:04

+0

@DavidHefferman当引发运行时异常时,执行停止,将打印一条消息,指出发生异常的位置并退出程序。我只是想知道何时/何地发生了异常(向stderr发送消息?)并允许执行继续。也许这是不可能的......我不太了解这些东西是如何工作的...... – mgilson 2012-04-18 13:56:08

回答

4

我不知道遇到浮点异常时的警告方式。但是gfortran和ifort都有信号处理例程。请参阅英特尔Fortran编译器User and Reference Guides (warning: large PDF)signal和 gfortran文档(请参阅第406页上的“病毒”)。

你可以建立一个呼叫的信号,下列操作之一signal

  • 忽略指定的信号(由数字标识)。
  • 使用指定信号的默认动作,该动作可以重置先前建立的动作。
  • 将控制从指定的信号传输到接收信号的过程,按名称指定。

在你的情况,你会想编写一个函数做一些事情,当一个浮点异常发生时(例如打印文件名/行号),并在上面的列表中使用第三个选项。

不幸的是,这不是非常便携的:看看this page为各种编译器的信号处理的例子。如果你想

  • 对多编译
  • 只使用信号处理程序,如果一些预处理标志被设置(参见-NDEBUG

更新编译你可以在包裹预处理宏一些代码:根据High Performance Mark的建议,ieee_exceptions内部模块的异常处理设施最终将成为实现此目的的便携方式。

+0

有关Fortran信号处理的相关知识 - 虽然我可能会在C中做这个部分,因为它稍微更加标准化。我仍然不知道如何获得发生异常的行号/文件名/堆栈跟踪 - 有一点搜索使我觉得这将是相当混乱的业务。 – mgilson 2012-04-18 14:25:11