繁体   English   中英

如何放入 clojure function 中的 repl 并打印堆栈跟踪

[英]How to drop into a repl inside a clojure function and print the stack traces

给定以下 function

(defn func []
  (break!))

我想要中断 function 来启动一个 repl,并且在该 repl 中我可以打印调用func的调用堆栈。

该功能类似于ipdb中的 ipdb,当我们想在某些 function 的运行时内进行交互调查时,它非常方便。

一个非常基本的版本可能只是:

(defn break! [] (clojure.main/repl))

这将启动一个新的嵌套 REPL,当您退出它时(在 Windows 上使用 ^D -- 或 ^Z),它将继续运行。

你不能评估当地人,但如果你写break! 作为一个宏,您至少可以在启动 REPL 之前显示活动的本地人:

user=> (defmacro break! []
         (let [locals (into {} (map (juxt keyword identity)) (keys &env))] 
           (prn locals) 
           (clojure.main/repl :prompt #(print "nested> "))))
#'user/break!
user=> (defn foo "Using the break! function." [a b] (break!))
#'user/foo
user=> (foo 13 42)
{:a 13, :b 42}
nested> (doc foo)
-------------------------
user/foo
([a b])
  Using the break! function.
nil
nested> ^D
nil
user=>

如果您希望堆栈跟踪作为嵌套 REPL 中的数据,您可以评估(:trace (Throwable->map (Throwable.)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM