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

时间:2015-05-19 10:05:41

标签: clojure

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

在调试和运行时调用方面,我非常喜欢pry(在Ruby上)的工作方式。对于clojure代码有没有相当于pry?或者可能是我错过的技术/工具?

3 个答案:

答案 0 :(得分:9)

有两种方法可以考虑改善您的REPL和调试体验:

  • 使用与编辑器或选择的IDE集成的REPL和调试器
  • 使用嵌入式nREPL服务器

第一个是建立本地Clojure开发环境的重要部分,无论如何都应该这样做。使用嵌入式nREPL服务器的第二个选项在使用中更接近于如何在代码中使用binding.pry调用,因为它允许您访问正在运行的应用程序,但它不用于停止执行某些点,而是为您提供一个可以访问正在运行的应用程序的REPL,并且它本身不提供任何其他调试功能。

使用REPL和调试器的编辑器/ IDE

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

此时(2015年5月)我高度建议使用Intellij IDEA尝试Jetbrain的Cursive plugin,因为它非常支持调试。您可以使用Intellij的免费社区版,而Cursive插件(此时)也是免费的。

Intellij IDEA

要安装Cursive,您可以进入Intellij的设置,为您拥有的Intellij版本添加正确的Cursive插件存储库,安装Cursive,然后重新启动IDE。

一旦Cursive处于活动状态,您只需通过“File> Open ...”在Intellij中打开现有的Leiningen项目。要运行REPL,请单击主菜单中的“运行>编辑配置”。在出现的窗口中,单击左上角的“+”按钮,然后选择“Clojure REPL> Local”。我将运行配置的名称从“未命名”更改为“REPL”,但保留默认值并按“确定”以保存运行配置。

现在,您可以为已打开的项目运行REPL设置。您现在可以单击“运行>运行'REPL'”(或任何您命名的运行配置)以获得正常的REPL,或者更好的是单击“运行>调试'REPL'”以在调试模式下启动REPL允许您使用Intellij的调试功能来调试您的Clojure代码。设置断点,添加断点条件,运行代码并检查框架,变量等,就像在任何调试器中一样。

在您的情况下,您需要单击“运行>调试'REPL'”,然后在该REPL中执行用于启动应用程序的代码。

嵌入式nREPL服务器

上述方法假设您首先启动Clojure REPL然后启动您的应用程序。如果你想让你的应用程序正常启动,然后选择获得一个存在于正在运行的Clojure程序中的REPL,那么直接使用nREPL是你最好的选择。

来自其自己的自述文件:

  

nREPL是一个Clojure网络REPL,它提供REPL服务器和客户端,以及一些用于IDE和其他可能需要在远程环境中评估Clojure代码的工具的常用API。

您应该follow these instructions将正在运行的nREPL服务器添加到您的应用程序中,但这是最重要的部分:

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

一旦你有一个正在运行的nREPL服务器作为你的Clojure应用程序的一部分,你可以使用你选择的编辑器或IDE连接到它(每个编辑器/ IDE都有不同的方法来做到这一点,但大多数都有一种方法可以附加到通过提供主机(通常是localhost)和运行nREPL服务器的端口来运行REPL,或者通过命令行直接调用Leiningen,如下所示:

lein repl :connect <port>

您可以在配置nREPL服务器时指定<port>,如上所示。它还会在启动时打印出来。

答案 1 :(得分:4)

another question是一个基本的REPL调试器,它提供的功能与pry-debug中的功能非常相似。您可以将其视为使用CIDER&amp ;;等工具中提供的调试器的替代方法。行草。

答案 2 :(得分:1)

调试是clojure中的一个大问题,因为我们也不知道错误发生在哪里。定义这个宏: (defmacro dbg [x]`(让x#~x来理解腐烂的位置