Bug hunting toolbox
Note: This is a work in progress. When it is complete these notes will be removed.
Note: Do not reply to this topic, questions, concerns, comments, etc. are to handled in
Wiki Discussion: Bug hunting toolbox
Note: This is just to get the topic started and hopefully others to jump in and make this useful. Even if you are brand new to Prolog, this is such a basic and fundamental concept that you can and should join in to help improve the value of this Wiki. Join the discussion at Wiki Discussion: Bug hunting toolbox
library(debug) - Manage debug messages and check assertions.
- is_of_type(+Type, @Term) is semidet
True if Term satisfies Type.
Runtime determinacy checker (rdet) - can be used to trap predicates that should never fail.
- setup_call_cleanup/3 can also test for determinism.
must_be (+Type, @Term)
True if Term satisfies the type constraints for Type. Defined types are
library(check): Consistency checking - This library provides some consistency checks for the loaded Prolog program.
Cross-referencer - A cross-referencer is a tool that examines the caller-callee relation between predicates, and, using this information to explicate dependency relations between source files, finds calls to non-existing predicates and predicates for which no callers can be found.
- gxref - Run cross-referencer on all currently loaded files and present a graphical overview of the result.
Draw diagrams - Graph drawing software (Wikipedia) or Pen and paper.
GraphViz is a popular console application which has several domain specific languages for describing graphs on which DOT seems to be the most popular. Example here.
Consider Cognitive dimensions of notations
- generate_debug_info(bool, changeable)
true(default) generate code that can be debugged using trace/0, spy/1, etc. Can be set to
falseusing the -nodebug . This flag is scoped within a source file. Many of the libraries have
:- set_prolog_flag(generate_debug_info, false)to hide their details from a normal trace.
See: Append/3 isn’t deterministic if first arg is var?
Add this to your code at the place where you want a conditional break and run
(some_condition -> gtrace ; true),
Using the Logtalk linter to check Prolog modules code: See: Linter
prolog_clause.pl – Get detailed source-information about a clause. This module started life as part of the GUI tracer. As it is generally useful for debugging purposes it has moved to the general Prolog library.