clojure多个StackOverflowError

时间:2018-03-08 11:34:19

标签: clojure stack-overflow

我有一个clojure脚本,我已经运行了好几年了。

最近我不得不重新安装leiningen和java 8.

当我运行代码时,我现在在第三方库上获得了多个StackOverflowErrors。

E.g。 StackOverflowError org.apache.commons.math3.util.FastMath.cosQ(FastMath.java:1850)

StackOverflowError clojure.lang.Numbers $ DoubleOps.combine(Numbers.java:571)

我会发布代码,但它现在发生在我的代码和第三方库的多个点上?

2 个答案:

答案 0 :(得分:2)

没有堆栈跟踪和一些代码,很难找到特定的anser,所以这里有一些通用的方法:

第1部分“之前运行的内容”:

通过挖掘日志,还原为备份等来重新创建旧环境,然后运行:

lein deps :tree 2>&1 > old-lein-dependencies

2>&1部分确保版本范围和冲突警告   包括在输出中。

记下leiningen版本和java版本:

lein version

第2部分:“现在正在运行什么”

重复这些步骤并记录与以前相同的信息:

lein deps :tree 2>&1 > new-lein-dependencies
lein version
java -version

第3部分:差异和比较

挑选所有差异

diff -u old-lein-dependencies new-lein-dependencies

在顶部会有一大块差异,莱因打印出所有重要的警告。最后的线索几乎总是在这里,虽然通常不容易立即识别。

第4部分:做科学

完成每个版本更改,从初始配置开始,通过固定project.clj中的版本,直到找到破坏事物的更改。固定这些的便捷方法是使用project.clj文件中的:managed-dependencies块。它看起来像这样:

:managed-dependencies [[http-kit "2.3.0-alpha4"]]

并重复切换版本的过程,直到您掌握引入更改的位置。对我来说,这几乎总是在依赖项而不是特定版本中使用版本范围的结果。我对版本范围不再太热心了: - /

答案 1 :(得分:0)

所以我无法比较以前的设置,因为它是在擦干净的机器上。

我发现错误已经悄悄进入该工具执行的一个数学公式,它基本上反复调用自身,导致堆栈溢出错误。