gprolog:在exception之后获取堆栈跟踪
在使用gprolog的时候,我经常会遇到这样的例外:
uncaught exception: error(instantiation_error,(is)/2)
没有任何的上下文。 我知道我可以做一个trace
但是trace
debugging需要很长时间,因为我需要在发生错误之前执行很多事情。
任何想法如何有这个堆栈跟踪? 还是一个dynamic的trace
/ notrace
?
编辑:或者只是自动打印整个trace
输出。
@ gusbro的答案( s(X)
)显示了你如何用GNU的debugging器来解决这个问题。 但是,如果您看不到所有打印正在进行,或者打印速度太慢,则可以考虑下面的“debugging程序”。
我个人不会使用Prolog系统提供的debugging器,原因很简单,大多数debugging器打印得太多,经常是自己的错误,并且有自己特定的不断变化的约定,我不能学习。
:- op(900, fx, [@,$,$-]). $-(G_0) :- catch(G_0, Ex, ( portray_clause(exception:Ex:G_0), throw(Ex) ) ). $(G_0) :- portray_clause(call:G_0), $-G_0, portray_clause(exit:G_0). @(G_0) :- ( $-G_0 *-> true ; portray_clause(badfail:G_0), throw(goal_failed(G_0)) ). :- op(950, fy, *). *(_).
要使用它,只需在特定目标前添加$-
, $
或@
。
$-
意味着:只有信号例外才能通过这个目标
$
另外显示呼叫和退出
@
确保至less有一个答案,如果没有,则会报告并抛出exception。
谨慎使用上面的注释!
*
取消目标。 这是为了推广一个在纯粹的单调程序中进行程序修改/切片的程序。 有关如何使用它的示例,请参阅以下答案/debugging会话1,2,3,4,5,6,7,8 。
_/*term*/
用一个匿名variablesreplace一个词。 这比*
单独推广了一个程序。 示例会话: 1,2,3,4 。
以这种方式,您可以减less显着的观看信息。
在其他支持meta_predicate
指令(如SICStus,YAP和SWI)的系统中,请在前面添加以下指令:
:- meta_predicate(( $-(0), $(0), @(0) )).
您可以trace/0
并仅占用exception端口,例如:
?- trace. ?- leash([exception]).
然后你运行你的程序,它会在屏幕上打印一个跟踪,但是只有当exception发生时才会停止。 在那里你可以看到“堆栈跟踪” (祖先)按字母g
。