什么是在Emacs和SLIME中调试Common Lisp的有效方法?

时间:2016-06-10 18:25:43

标签: debugging emacs common-lisp sbcl slime

我想知道使用Emacs和SLIME以交互方式调试Common Lisp的有效方法是什么。

我之前做过的事情:作为使用IDE(VS和PyCharm)学习C和Python的人,我习惯于设置断点,添加监视器,并进行步进。但是当我开始使用CL时,我发现调试工作流程根本不同。我没有找到设置断点的好方法,通过线条查看变量如何变化。

我使用的哑方法是在代码中添加“print”并反复运行代码,效率非常低。我知道我们可以在SLIME中“检查”变量,但不知道如何以交互方式进行。

我发现了什么:我最近在development of a Morse code translator上看到了这个视频,它展示了如何在SLIME中以交互方式进行调试的完整过程,这一过程非常丰富且具有启发性。就好像我们可以与编译器“交谈”。

我想要的是什么:我在网上搜索,但找到了最少的教程,展示了经验丰富的Lisper 实际如何开发和调试他们的程序。我渴望学习这样的经历。

  • 如何以交互方式调试?
  • 有哪些好的做法和提示?如何添加断点和步骤?
  • 您最常使用哪些快捷方式/工具/工作流/在调试时最有用?

2 个答案:

答案 0 :(得分:8)

您可以做很多事情:

  • 您可以跟踪函数调用(请参阅Common Lisp中的TRACEUNTRACEslime-toggle-trace-fdefinition*)。这有助于递归调用:您可以看到您传递的内容以及它们在每个级别返回的内容。
  • 标准事物:在地方添加(format t ...)。我猜,不需要评论。
  • 如果代码中断,您将进入调试器。从那里,您可以检查堆栈,查看调用的内容以及传递的参数。请参阅@jkiiski链接:它有非常好的信息,包括(break)形式,它将充当断点并让您进入调试器。 扰流器警报:您可以更改检查器中的值,您可以更改并重新编译代码,并从(几乎)堆栈中的任何位置重新启动。
  • 最后但并非最不重要:要调试宏,您需要slime-macroexpand-1MACROEXPAND-1的包装器),甚至更好C-c M-e的宏步进器。

最后一条建议:如果要进行严格的调试,请在文件中包含(declaim (optimize (debug 3))),否则某些CL实现会倾向于优化堆栈上的调用或使参数无法访问。

答案 1 :(得分:-1)

使用Common Lisp和Slime,您可以设置断点,查看变量的值,使用检查器查看包括类实例的复合数据结构,并逐步执行代码-从原理上讲,所有这些都与您所需要的相似与像PyCharm这样的IDE一起使用。 Rainer Joswig的视频使用Clozure Common Lisp,GNU Emacs和SLIME https://vimeo.com/77004324)调试CL-HTTP演示了所有这些功能,因此您可以了解如何在Slime中实现它。

相对于使用PyCharm进行调试,我在Common Lisp + Slime中实际上更喜欢的一个功能是,在前一种情况下,您可以正常运行程序并自动在出现错误时自动进入调试器,并且默认情况下调试器在发生未捕获的异常时停止。相比之下,使用PyCharm可以运行程序,遇到错误,然后使用调试器重新启动程序并手动设置断点,或在任何异常情况下要求PyCharm中断。 PyCharm当前不支持仅在未捕获的异常时自动中断。