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

Jia*_* Xu 10 debugging emacs sbcl common-lisp slime

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

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

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

我发现的内容:我最近看到了关于摩尔斯电码转换器开发的视频,它展示了如何在SLIME中以交互方式进行调试的完整过程,这一过程非常丰富,具有启发性.就好像我们可以与编译器"交谈"一样.

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

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

mob*_*eng 9

你可以做很多事情:

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

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