如果我有一个用作命令行工具的程序,我有哪些调试选项?
为了这个例子,假设程序看起来像这样。
清单do_stuff.pl
:
main :-
current_prolog_flag(argv, Argv),
do_stuff(Argv),
halt.
main :-
halt(1).
使用 SWI-Prolog,我可以编译它:
swipl --goal=main -o do_stuff -c do_stuff.pl
我可以通过简单地调用来运行它
$ ./do_stuff foo bar baz
就目前而言,如果do_stuff/1
失败,它将以 1 退出。我怎样才能看到失败的第一个(最早、最深的)目标?或者更好的是,整个回溯?我假设我应该能够使用debug
and leash
,例如:
main :-
current_prolog_flag(argv, Argv),
debug, leash(+fail),
do_stuff(Argv),
halt.
...但我没有尝试过任何有效的方法。
我唯一半途而废的想法是为每个我希望确定性成功但没有成功的谓词抛出一个错误。这当然是可行的,但似乎有点过分?
动机
用作命令行工具的程序(通常)意味着运行一次,获取其参数,读取其输入,写入输出。在这种情况下,失败意味着什么?我的解释是,意外失败是程序中的错误。
单元测试可能会有所帮助(单独测试谓词);但是,根据定义,这对于由于程序员对问题、范围或工具缺乏了解而导致的错误没有帮助。只有使用实际输入运行程序才能捕获此类错误。
所以,给定上面的例子,如果某个用例导致do_stuff/1
失败,并且程序以非零代码退出,程序员有什么选择来确定哪个谓词失败?
评论中链接的答案提供了一种解决方案。但是(如果我理解正确的话)这确实需要程序员系统地检查执行流程,直到找到有问题的谓词调用。
这正是我希望避免的。