如何异常停止fortran程序

how to stop a fortran program abnormally

当发生异常时,我想异常终止我的程序。现在,当异常发生时,调用带有解释语句的 write 语句,然后调用 stop 语句。

我正在使用 idb(英特尔调试器)调试程序,当异常发生时我得到 write 语句,但 idb 将程序视为正常终止。我希望当异常发生时程序异常终止,这样我就可以在异常发生的地方用 backtrace 查看内存。

我曾尝试更改 stop 1 中的 stop,以便返回非零值,但这不起作用

编辑:

我已经在其中一个答案中实现了解决方案:

 interface
    subroutine abort() bind(C, name="abort")
    end subroutine
 end interface

 print *,1
 call abort()
 print *,2
end

使用此解决方案时,我在使用 ifort 13.0.1 时仍然没有得到任何回溯,但这与 ifort 14.0.2.

完美配合

我使用idb而不是gdb,因为后者通常无法读取fortran中的可分配数组的值。

对此有非标准的扩展。 Gfortran 使用 backtrace() 在任何地方打印回溯,对于 Intel 的等效项,请参阅 wander95 的答案

在 ifort 和 gfortran 中,您可以调用 abort() 子例程,如果您使用 -traceback (Intel) 或 -g -fbacktrace (gfortran) 编译器选项,您将获得回溯。

您也可以使用 C 互操作性直接调用 C abort()。 (也是非标准的,可能无法在所有情况下工作):

  interface
    subroutine abort() bind(C, name="abort")
    end subroutine
  end interface

  print *,1
  call abort()
  print *,2
end

在 Fortran 2008 中引入了 ERROR STOP 语句。它主要用于 Coarray Fortran 程序,以启动所有图像的错误终止。

我从来没有用过idb,我只用过gdb,所以这可能行不通。我只是在错误点放了一条read语句,让程序停下来等待输入。然后我可以 CTRL-C 它,这会导致 gdb 暂停执行,从中我可以获得回溯,在堆栈中上下移动,查看变量等。

偶然发现这个老问题。如果你想用intel编译器异常终止,你可以使用例程tracebackqq。调用顺序可以是:

     call TRACEBACKQQ(string=string,user_exit_code=user_exit_code)

引用说明书:

Provides traceback information. Uses the Intel® Fortran run-time library traceback facility to generate a stack trace showing the program call stack as it appeared at the time of the call to TRACEBACKQQ( )