gprolog: Abrufen eines Stacktrace nach einer Ausnahme

Bei der Verwendung von gprolog habe ich oft Ausnahmen ohne irgendeine Zeilennummer oder einen Kontext wie diesen:

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

Ohne irgendeine Art von Kontext. Ich weiß, dass ich eine trace aber es würde sehr lange dauern, es mit trace zu debuggen, da ich viele Dinge ausführen muss, bevor ich an den Ort komme, an dem der Fehler auftritt.

Irgendeine Idee, wie man diesen StackTrace hat? Oder eine dynamische trace / notrace ?

EDIT: Oder einfach das Drucken der gesamten trace Ausgabe automatisieren.

@ gusbros Antwort ( s(X) ) zeigt dir, wie du das mit GNUs Debugger etwas triggers. Wenn Sie es sich jedoch nicht leisten können, alle Druckvorgänge zu sehen, oder ist es viel zu langsam, können Sie den folgenden “Debugger” in Betracht ziehen.

Ich benutze selbst keine Debugger, die von Prolog-Systemen angeboten werden, aus dem einfachen Grund, dass die meisten von ihnen viel zu viel drucken, oft selbst errorshaft sind und ihre eigenen spezifischen sich ständig ändernden Konventionen haben, die ich mir nicht leisten kann zu lernen.

 :- 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, *). *(_). 

Um es zu verwenden, fügen Sie einfach $- , $ oder @ vor einem bestimmten Ziel hinzu.

$- bedeutet: nur Signalausnahmen, die dieses Ziel durchlaufen

$ zusätzlich Call anzeigen und beenden

@ sicher, dass es mindestens eine Antwort gibt, und wenn nicht, wird dies gemeldet und eine Ausnahme wird ausgetriggers.

Verwenden Sie obige Anmerkungen sparsam!

* Entfernt das Ziel. Dies dient dazu, ein Programm zu verallgemeinern, das Programmänderungen / Slicing in einem reinen monotonen Programm durchführt. Beispiele zur Verwendung finden Sie in den folgenden Antworten / Debugging-Sitzungen 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 .

_/*term*/ ersetzt einen Begriff durch eine anonyme Variable. Dies verallgemeinert ein Programm noch weiter als * alleine. Beispielsitzungen: 1 , 2 , 3 , 4 , 5 , 6 , 7 .

Auf diese Weise können Sie die Informationen, die Sie genau sehen, reduzieren.

In anderen Systemen, die meta_predicate statementen wie SICStus, YAP und SWI unterstützen, fügen Sie die folgende Direktive hinzu:

 :- meta_predicate(( $-(0), $(0), @(0) )). 

Sie können trace/0 und leash/1 nur den Ausnahme- Port trace/0 , zB:

 ?- trace. ?- leash([exception]). 

Dann führen Sie Ihr Programm aus und es wird eine Ablaufverfolgung auf dem Bildschirm drucken, aber nur anhalten, wenn eine Ausnahme auftritt. Dort können Sie die “Stack Trace” (Vorfahren) durch Drücken des Buchstabens g .