当发生异常时,我想异常终止我的程序。现在,当异常发生时,调用带有解释性句子的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
中可分配数组的值。
答案 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
暂停执行,我可以从中获得回溯,在堆栈中上下移动,查看变量等。