如何异常停止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( )
当发生异常时,我想异常终止我的程序。现在,当异常发生时,调用带有解释语句的 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( )