有没有更好的方法来调试Clojure代码?

15

我已经使用Clojure工作了几周,主要使用Lein+Luminus框架。我一直在寻找一种在REPL上调试代码的方法。

我非常喜欢pry(Ruby上的一个调试工具)的工作方式,特别是在调试和运行时调用方面。是否有类似于Clojure代码的pry等效工具?或者可能是我错过的技术/工具吗?


4
如果您能描述一下您具体需要 pry 做什么,那么非 Ruby 开发人员也可以提供有用的答案,这将会很有帮助。 - schaueho
3个回答

17
有两种方法可以改进您的REPL和调试体验:
  • 使用您选择的编辑器或IDE集成的REPL和调试器
  • 使用嵌入式nREPL服务器
第一种方法是设置本地Clojure开发环境的必要部分,应该无论如何都要完成。第二个选项,使用嵌入式nREPL服务器,更接近于您在代码中使用binding.pry调用的方式,因为它使您可以访问正在运行的应用程序,但它不用于在某个点停止执行,而是为您提供一个具有对正在运行的应用程序的访问权限的REPL,并且它本身不提供任何其他调试功能。

带有REPL和调试器的编辑器/IDE

像Emacs和Vim这样的文本编辑器具有出色的Clojure支持(用于编辑和与REPL交互),大多数Java IDE也支持Clojure。

截至2015年5月,我强烈建议尝试使用JetBrain的Intellij IDEA和其Cursive插件进行编程,因为它在调试方面有着出色的支持。你可以使用免费的社区版Intellij,而Cursive插件目前也是免费的。

Intellij IDEA

要安装Cursive,你需要进入Intellij的设置界面,添加适用于你的Intellij版本的正确的Cursive插件仓库,安装Cursive,并重新启动IDE。

一旦Cursive被激活,你可以通过"文件>打开..."在Intellij中简单地打开一个现有的Leiningen项目。要运行REPL,请单击主菜单中的"运行>编辑配置"。在出现的窗口中,单击左上角的"+"按钮,然后选择"Clojure REPL>本地"。我会将运行配置的名称从"未命名"更改为类似于"REPL"的东西,但保持默认值并按"确定"保存运行配置即可。

现在你有一种方法可以为你打开的项目设置REPL。你现在可以点击“运行>运行'REPL'”(或者您命名的运行配置),以获得一个普通的REPL,或者更好的是点击“运行>调试'REPL'”,以启动REPL调试模式,这将允许您使用Intellij的调试功能来调试Clojure代码。像任何调试器一样设置断点,添加断点条件,运行代码和检查帧、变量等。
在您的情况下,您需要点击“运行>调试'RePL'”,然后在该REPL中执行您用于启动应用程序的代码。
嵌入式nREPL服务器
上述方法假定您首先启动Clojure REPL,然后启动应用程序。如果相反,您想要正常启动应用程序,然后可选地获取一个位于运行中的Clojure程序内部的REPL,则直接使用nREPL是最佳选择。
从其自己的README中:
nREPL是一个Clojure网络REPL,提供了一个REPL服务器和客户端,以及一些常用的API,用于IDE和其他可能需要在远程环境中评估Clojure代码的工具。

你应该按照这些指示为你的应用添加一个运行中的nREPL服务器,但这是最重要的部分:

=> (use '[clojure.tools.nrepl.server :only (start-server stop-server)])
nil
=> (defonce server (start-server :port 7888))
#'user/server

一旦您的Clojure应用程序中有一个运行中的nREPL服务器,您可以使用您选择的编辑器或IDE连接到它(每个编辑器/IDE都有不同的方法来实现这一点,但大多数都提供了一种通过提供主机(通常是localhost)和运行nREPL服务器的端口来连接运行中的REPL的方式),或者直接在命令行上调用Leiningen,如下所示:lein repl :connect <port>。您可以在配置nREPL服务器时指定<port>,就像上面展示的那样。它在启动时也会打印出来。

2
顺便提一下,未发布的 CIDER 0.9 还具有真正的调试器功能 http://endlessparentheses.com/cider-debug-a-visual-interactive-debugger-for-clojure.html - Bozhidar Batsov
这是一个非常受欢迎的补充 :-) @BozhidarBatsov 在 CIDER 上做得非常出色。 - semperos

6

clj-debugger 是一个基本的REPL调试器,提供了与 pry-debug 类似的功能。您可以考虑使用它作为CIDER和Cursive等工具中可用调试器的替代方案。


2

在Clojure中,调试是一个巨大的问题,因为我们不知道错误发生的位置。定义这个宏: (defmacro dbg[x] `(让 x# 等于 ~x),以了解错误被抛出的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接