如何异常停止一个fortran程序

时间:2015-05-26 15:08:00

标签: fortran fortran90

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

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

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

编辑:

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

 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中可分配数组的值。

4 个答案:

答案 0 :(得分:3)

这有非标准的扩展。 Gfortran使用backtrace()在任何地方打印回溯,对于英特尔的等价物,请参阅wander95的回答https://stackoverflow.com/a/38905855/721644

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

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

偶然发现了这个老问题。如果您希望使用intel编译器异常终止,则可以使用例程tracebackqq。呼叫顺序可以是:

     call TRACEBACKQQ(string=string,user_exit_code=user_exit_code)

引用手册:

  

提供追溯信息。使用英特尔®Fortran运行时库跟踪工具生成堆栈跟踪,显示调用TRACEBACKQQ()时出现的程序调用堆栈

答案 3 :(得分:0)

我从未使用<header> <!-- site-wide header --> <h1>Example <!-- site name --></h1> </header> <main> <!-- this page’s main content --> </main> <nav> <!-- site-wide navigation --> </nav> <footer> <!-- site-wide footer --> </footer> ,我只使用了idb,所以这可能不起作用。我只是在错误点放入一个read语句,以便程序停止并等待输入。然后我可以CTRL-C它,这会导致gdb暂停执行,我可以从中获得回溯,在堆栈中上下移动,查看变量等。