在使用 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/

10-11 04:00