如何异常停止fortran程序

sim*_*ona 6 fortran fortran90

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

我正在使用idb(intel debugger)调试程序,当异常发生时,我得到了该write语句,但idb将程序视为正常终止。我希望当异常发生时程序异常终止,以便我可以backtrace在异常发生的地方查看内存。

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

编辑:

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

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

 print *,1
 call abort()
 print *,2
end
Run Code Online (Sandbox Code Playgroud)

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

我求助于使用idb而不是gdb,因为后者通常无法读取fortran.

Vla*_*r F 6

这有非标准的扩展。Gfortran 用于backtrace()在任何地方打印回溯,对于英特尔的等价物,请参见 wander95 的回答/sf/answers/2723409881/

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

您还abort()可以使用 C 互操作性直接调用 C。(也是非标准的,可能不适用于所有情况):

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

  print *,1
  call abort()
  print *,2
end
Run Code Online (Sandbox Code Playgroud)

  • @simona 也许您遇到了这个问题?https://software.intel.com/en-us/forums/topic/487091 我得到了 ifort 14.0.1 的回溯,但奇怪的是,它是 SIGSEGV 而不是 SIGABRT。 (2认同)