我曾尝试使用以下组件继承了Clojure的应用程序:Clojure的Web应用程序:如何逐步完成请求
- Jetty服务器
- 的Compojure
- 环
为了获得一个对应用程序的理解,我想逐步通过请求。 我使用Emacs作为我的IDE。
是否有任何工具或技术可以用来完成此操作?
我曾尝试使用以下组件继承了Clojure的应用程序:Clojure的Web应用程序:如何逐步完成请求
为了获得一个对应用程序的理解,我想逐步通过请求。 我使用Emacs作为我的IDE。
是否有任何工具或技术可以用来完成此操作?
不幸的是,Clojure没有任何现成的步调试器。可以使用jdb连接到jvm,并逐个查看字节码,但这不会直接反映您的Clojure代码(特别是感谢懒惰等原因,可能会导致应用程序中的不同上下文评估某些代码,而不是源代码布局会让你期待)。
虽然没有丢失。由于强烈关注在惯用Clojure代码中使用不可变数据和纯函数,因此可以直接捕获函数在运行时获得的输入值,以便调查和/或实验新值。例如:
核心命名空间中,你定义你的处理器和发射码头,并开始从同一进程的nrepl服务器:
(ns my-server.core
(:require [ring.middleware
[json :refer (wrap-json-params)]
[multipart-params :refer (wrap-multipart-params)]]
...
[clojure.tools.nrepl.server :as nrepl-server]))
...
(defn init
[]
(when (= (System/getProperty "with_shell") "true")
(nrepl-server/start-server :port 7888))
(run-jetty handler :port 8080))
的代码命名空间中服务于特定的请求,你可以跟踪输入数据,以使用/调查它在REPL
(ns my-ns.controllers.home)
(defonce debug (atom []))
(defn home
[request]
(let [in (java.util.Date.)
response (process request)
out (java.util.Date.)]
(swap! debug conj {:in request :out response :fn home :timing [in out]})
response))
然后,从REPL连接,您可以查询我的-ns.controllers.hom /调试的状态,通过derefing原子和看到各种输入和输出值。这可以概括为调查各种中间值的内容,无论你想跟踪执行。由于数据对象通常不是不可修饰的,所以如果创建一个原子来存储这些值,那么可以有一个完整的记录。请注意,通过在计算请求之前和之后创建时间戳,您可以剖析请求处理函数正文的执行情况(为了清晰起见,我已将其抽象为单个函数)。
如果您想使用基于打印的跟踪,还有类似clojure.tools.trace的库。