gprolog:在异常后获取堆栈跟踪

dam*_*mio 9 debugging prolog gnu-prolog

使用gprolog时,我经常会遇到没有任何类型的行号或上下文的异常:

uncaught exception: error(instantiation_error,(is)/2)
Run Code Online (Sandbox Code Playgroud)

没有任何背景.我知道我可以做一个trace但是调试它需要很长时间,trace因为我需要在到达发生错误的地方之前执行很多事情.

有关如何进行此堆栈跟踪的任何想法?还是一个动态trace/ notrace

编辑:或者只是自动化整个trace输出的打印.

fal*_*lse 9

@ 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, *).
*(_).
Run Code Online (Sandbox Code Playgroud)

要使用它,只需添加$-,$@在特定目标前.

$- 表示:仅发出通过此目标的异常信号

$ 另外显示呼叫和退出

@ 确保至少有一个答案,如果没有,则报告并抛出异常.

谨慎使用上面的注释!

*删除目标.这是为了概括在纯单调程序中执行程序修改/切片的程序.对于实施例如何使用它,请参阅下列的答案/调试会话 1, 2, 3, 4, 5, 6, 7, 8.

_/*term*/用匿名变量替换术语.这比*单独推广程序更进一步.示例会话: 1, 2, 3, 4, 5, 6, 7.

通过这种方式,您可以显着减少您所观看的信息.

在支持meta_predicateSICStus,YAP和SWI 等指令的其他系统中,请在前面添加以下指令:

:- meta_predicate(( $-(0), $(0), @(0) )).
Run Code Online (Sandbox Code Playgroud)


gus*_*bro 8

你可以trace/0leash/1只有例外端口,例如:

?- trace.
?- leash([exception]).
Run Code Online (Sandbox Code Playgroud)

然后运行程序,它将在屏幕上打印一条跟踪,但只有在发生异常时才会停止.在那里你可以通过按字母看到"堆栈跟踪"(祖先)g.


归档时间:

查看次数:

866 次

最近记录:

6 年,4 月 前