在使用 gprolog 时,我经常遇到没有任何行号或上下文这样的异常:
uncaught exception: error(instantiation_error,(is)/2)
没有任何类型的上下文。我知道我可以做一个
trace
,但是用trace
调试它会花费很长时间,因为在到达错误发生的地方之前,我需要执行很多事情。关于如何拥有此stacktrace的任何想法吗?还是动态的
trace
/notrace
?编辑:或只是自动打印整个
trace
输出。 最佳答案
@gusbro的答案(s(X)
)向您展示了如何使用GNU的调试器解决此问题。但是,如果您看不起所有打印正在进行,或者速度太慢,则可以考虑使用以下“调试器”。
我个人不使用Prolog系统提供的调试器,原因很简单,其中大多数打印太多,经常自身出故障,并且具有自己特定的,不断变化的约定,我无法学习。
:- 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, *).
*(_).
要使用它,只需在特定目标前面添加$-
,$
或@
即可。$-
的意思是:仅表示通过此目标的异常$
另外显示调用和退出@
确保至少有一个答案,如果没有答案,则会报告该答案并引发异常。请谨慎使用以上注释!
*
删除了目标。这是为了在纯单调的程序中概括执行程序修改/program-slicing的程序。如果出现意外失败,则需要此功能。有关如何使用它的示例,请参见以下答案/调试 session 1,
2,
3,
4,
5,
6,
7,
8,
9。
_/*term*/
用匿名变量替换术语。这比单独的*
进一步推广了程序。 session 示例:1,
2,
3,
4,
5,
6,
7,
8,
9。
通过这种方式,您可以大大减少观看的信息。
在其他支持
meta_predicate
指令的系统(例如SICStus,YAP和SWI)中,请在前面添加以下指令::- meta_predicate(( $-(0), $(0), @(0) )).
关于debugging - gprolog : Getting a stacktrace after an exception,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30788208/