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

Debugging 在Emacs和SLIME中调试公共Lisp的有效方法是什么?,debugging,emacs,common-lisp,sbcl,slime,Debugging,Emacs,Common Lisp,Sbcl,Slime,我想知道使用Emacs和SLIME交互调试CommonLisp的一些有效方法是什么 我以前做过什么:作为一个使用IDE(VS和PyCharm)学习C和Python的人,我习惯于设置断点、添加手表和进行步进。但是,当我开始使用CL时,我发现调试工作流程有了根本的不同。我没有找到好的方法来设置断点,逐步通过线,看看变量是如何变化的 我使用的愚蠢方法是在代码中添加“print”并反复运行代码,这是非常低效的。我知道我们可以“检查”SLIME中的变量,但不确定如何以交互方式执行 我的发现:我最近在网上看

我想知道使用Emacs和SLIME交互调试CommonLisp的一些有效方法是什么

我以前做过什么:作为一个使用IDE(VS和PyCharm)学习C和Python的人,我习惯于设置断点、添加手表和进行步进。但是,当我开始使用CL时,我发现调试工作流程有了根本的不同。我没有找到好的方法来设置断点,逐步通过线,看看变量是如何变化的

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

我的发现:我最近在网上看到了这段视频,它展示了如何在SLIME中交互调试的完整过程,这段视频提供了大量信息,也很有启发性。就好像我们可以和编译器“交谈”

我想要什么:我在网上搜索了一些教程,但找到了一些演示一个有经验的Lisper如何实际开发和调试程序的教程。我渴望学习这些经验

  • 如何交互调试
  • 有哪些好的做法和技巧?如何添加断点和步骤
  • 调试时,您最常用/发现最有用的快捷方式/工具/工作流是什么

    • 您可以做很多事情:

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

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

      使用Common Lisp和Slime可以设置断点,查看变量的值,使用检查器查看包括类实例在内的复合数据结构,并逐步检查代码——所有这些原则上都与PyCharm之类的IDE非常相似。Rainer Joswig的视频调试CL-HTTP使用Clozure Common Lisp、GNU Emacs和SLIME()演示了所有这些特性,因此您可以看到SLIME在实践中是如何完成的


      在Common Lisp+Slime中,我实际上非常喜欢使用PyCharm进行调试的一个特性是,在Common Lisp+Slime中,您可以正常运行程序,并在出现错误时直接自动进入调试器,并且调试器默认会在引发未捕获异常时停止。相比之下,使用PyCharm运行程序,遇到错误,然后使用调试器再次启动程序,并手动设置断点或要求PyCharm在任何异常情况下中断。PyCharm目前不支持仅在未捕获的异常情况下自动中断。

      这里有一个关于@jkiiski的不错的博客系列,这正是我想要的!非常感谢!你还遇到过其他类似的资源吗?我发现这本书对学习者很有帮助:第16章关于调试,第17章关于优化。