Debugging 如何在Clojure stacktrace中查看函数参数?

Debugging 如何在Clojure stacktrace中查看函数参数?,debugging,clojure,stack-trace,Debugging,Clojure,Stack Trace,如何在Clojure stacktrace中查看传递给函数的参数 例如,我如何查看在此堆栈跟踪中传递给*get item,*normalize item ref,outvalue of,happiness和nodestr的参数?很高兴看到程序是如何出错的,而不仅仅是出错 ERROR in (this-test) (workspace.clj:330) Uncaught exception, not in assertion. expected: nil actual: java.lang.A

如何在Clojure stacktrace中查看传递给函数的参数

例如,我如何查看在此堆栈跟踪中传递给
*get item
*normalize item ref
outvalue of
happiness
nodestr
的参数?很高兴看到程序是如何出错的,而不仅仅是出错

ERROR in (this-test) (workspace.clj:330)
Uncaught exception, not in assertion.
expected: nil
  actual: java.lang.AssertionError: Assert failed: (item-or-item-ref? item-or-item-ref)
 at fargish.workspace$_STAR_get_item.invokeStatic (workspace.clj:330)
    fargish.workspace$_STAR_get_item.invoke (workspace.clj:330)
    fargish.workspace$_STAR_normalize_item_ref.invokeStatic (workspace.clj:365)
    fargish.workspace$_STAR_normalize_item_ref.invoke (workspace.clj:360)
    fargish.workspace$outvalue_of.invokeStatic (workspace.clj:815)
    fargish.workspace$outvalue_of.invoke (workspace.clj:810)
    fargish.workspace$outvalue_of.invokeStatic (workspace.clj:812)
    fargish.workspace$outvalue_of.invoke (workspace.clj:810)
    fargish.workspace$happiness.invokeStatic (workspace.clj:904)
    fargish.workspace$happiness.invoke (workspace.clj:902)
    fargish.workspace$nodestr.invokeStatic (workspace.clj:1039)
    fargish.workspace$nodestr.invoke (workspace.clj:1035)
    . . .

该信息不存在于stacktrace中。

该信息不存在于stacktrace中。

您可以在感兴趣的命名空间上运行sayid()。它将跟踪所有函数调用和参数

我认为这对开发/调试非常有用。对于生产,上面amalloy的try-catch建议可能是最好的。

您可以在感兴趣的名称空间上运行sayid()。它将跟踪所有函数调用和参数


我认为这对开发/调试非常有用。对于生产,上面amalloy的try-catch建议可能是最好的。

我怎么才能得到它呢?你必须给正在中断的函数添加一些代码,让它们打印出你想要的信息,或者以其他方式保存它。天哪,这就是我一直在做的。这是一种痛苦。我刚刚花了两个小时在一个bug上,我的大部分精力都花在了破解方法上,以查看传递了哪些参数,而不会被无关的东西淹没(因为这些函数经常被调用)。我的目标堆栈溢出。一定有更好的办法。实际上,“真正的”Clojure程序员如何解决这个问题呢;在catch子句中,重新显示一个包装异常,其中包含有关您所关心的任何局部变量的信息。这并不理想,因为它都是手动的和粗略的,在调用辅助函数时,您必须将所有局部变量保持在范围内,但这确实是我们所拥有的最好的。(除非你能想出如何在clojure中使用真正的JVM调试器,这是可能的,但并不容易)。事实上,我已经积累了一些宏来帮助打印东西,只有在从正确的位置调用时(以防止洪水),但我一直认为“真正的”Clojure程序员会知道一些简单的方法来完成它,当我最终看到它时,这会让我说“哦!Duh!!为什么我没有想到呢?”哦,好吧。让我感到惊讶的是,gdb可以在没有源代码的C程序上实现这一点,而JVM上的Clojure却不能。我怎么能得到它呢?你必须向正在崩溃的函数添加一些代码,让它们打印出你想要的信息,或者以其他方式保存它。天哪,这就是我一直在做的。这是一种痛苦。我刚刚花了两个小时在一个bug上,我的大部分精力都花在了破解方法上,以查看传递了哪些参数,而不会被无关的东西淹没(因为这些函数经常被调用)。我的目标堆栈溢出。一定有更好的办法。实际上,“真正的”Clojure程序员如何解决这个问题呢;在catch子句中,重新显示一个包装异常,其中包含有关您所关心的任何局部变量的信息。这并不理想,因为它都是手动的和粗略的,在调用辅助函数时,您必须将所有局部变量保持在范围内,但这确实是我们所拥有的最好的。(除非你能想出如何在clojure中使用真正的JVM调试器,这是可能的,但并不容易)。事实上,我已经积累了一些宏来帮助打印东西,只有在从正确的位置调用时(以防止洪水),但我一直认为“真正的”Clojure程序员会知道一些简单的方法来完成它,当我最终看到它时,这会让我说“哦!Duh!!为什么我没有想到呢?”哦,好吧。令我惊讶的是,gdb可以在没有源代码的C程序上实现这一点,而JVM上的Clojure则不行。我来看看。实际上,我只需要在开发/调试时使用它。我只想用一种简单的方法来找出在堆栈的每一级传递了哪些参数,而不必考虑太多。谢谢。我来看看。实际上,我只需要在开发/调试时使用它。我只想用一种简单的方法来找出在堆栈的每一级传递了哪些参数,而不必考虑太多。