9

gprologを使用しているときに、次のような行番号やコンテキストのない例外がよくあります。

uncaught exception: error(instantiation_error,(is)/2)

いかなる文脈もなしに。できることはわかっていますが、エラーが発生した場所に到達する前に多くのことを実行する必要があるため、traceデバッグに非常に時間がかかります。trace

このスタックトレースを取得する方法について何か考えはありますか? または動的trace/ notrace?

trace編集:または、出力全体の印刷を自動化するだけです。

4

2 に答える 2

12

@gusbro の回答 ( s(X)) は、GNU のデバッガーを使用してこれをある程度解決する方法を示しています。ただし、進行中のすべての印刷を表示する余裕がない場合、または遅すぎる場合はlibrary(debug)、Scryer のように次の「デバッガー」を利用できると考えることができます。

私は個人的に、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, *).
*(_).

使用するには、特定の目標の前に$-$、またはを追加するだけです。@

$-手段: このゴールを通過する例外のみを通知する

$さらに通話を表示して終了する

@少なくとも 1 つの回答があることを保証し、そうでない場合は報告され、例外がスローされます。

上記の注釈は控えめに使用してください。

*ゴールを削除します。これは、純粋な単調プログラムでプログラムの変更/を行うプログラムを一般化するためのものです。これは、予期しない障害が発生した場合に必要です。使用方法の例については、次の回答/デバッグ セッション 12345678910を参照してください。

_/*term*/項を無名変数に置き換えます。*これにより、プログラムは単独ではなくさらに一般化されます。セッションの例: 12345678910

このようにして、見る情報を大幅に減らすことができます。

SICStus、YAP、SWI などのディレクティブをサポートする他のシステムmeta_predicateでは、次のディレクティブを先頭に追加します。

:- meta_predicate(( $-(0), $(0), @(0) )).
于 2015-06-11T21:18:09.850 に答える