JVM因“无效内存访问位置”而导致分段错误

3

我有一个小项目,用Scala 2.9.2编写,使用ScalaTest编写单元测试。 我使用SBT进行编译和运行测试。

在我的项目上运行sbt test经常会导致JVM崩溃,但仅从SBT编译和运行我的项目可以正常工作。以下是精确的错误消息:

Invalid memory access of location 0x8 rip=0x10959f3c9
[1]    11925 segmentation fault  sbt

我找不到任何核心转储文件,但如果可以获取,我很乐意提供。

运行java -version会得到以下结果:

java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)

但是我也安装了Java 7(虽然我从未能够真正运行Java程序,据我所知)。

可能相关的另一个问题:我的一些测试用例包含带括号的标题,例如()。因此,SBT或ScalaTest(不确定)将在输出的中间插入方括号。例如,名称为(..)..(..)的测试用例可能会突然变成(..[)..](..)

非常感谢任何帮助解决这些问题的人 :-)

编辑:我安装了Java 7 JDK,所以现在java -version显示正确的结果:

java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)

这也意味着我现在可以获得更详细的段错误信息和核心转储:
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x000000010a71a3e3, pid=16830, tid=19459
#
# JRE version: 7.0_07-b10
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.3-b01 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.dylib+0x3cd3e3]

并且转储

编辑:将scalaVersion更改为2.9.1后,会先出现以下错误,然后出现与上述相同的错误:

Could not load hsdis-amd64.dylib; library not loadable; PrintAssembly is disabled
[thread 25091 also had an error]

你能否提供一个最小的代码和单元测试集,以便重现问题,并发布它? - The Archetypal Paul
我会尝试。我周末很忙,所以我下周再回复你。 - Dan
3个回答

1

当JVM崩溃时,通常表明系统内存存在问题,尤其是在没有被推到极限的情况下。

请在晚上运行memtestx86。


memtestx86 在 OS X 上似乎无法运行。我运行了几次 MemTest,没有发现任何错误。我相当确定这不是内存问题。除了在 SBT repl 中运行测试时遇到的问题外,我没有遇到任何问题。它大约每 10 次运行一次。 - Dan
@Dan:间歇性崩溃一定是内存或计算机问题。你在Scala、SBT或Java方面没有做错任何事情。 - Yann Ramin
@Dan 你考虑在另一台机器上尝试复现吗? - ziggystar
2
@ziggystar,我确实这样做了。我的一个朋友正在运行ArchLinux。他安装了Scala和SBT(也是Java 7),并运行了测试。他的JVM也崩溃了,所以这不可能是硬件问题。 - Dan
@Jatin,这里有一个包含所有测试和代码(以及build.sbt)的zip文件(https://dl.dropbox.com/u/131288/nussinov.zip)。希望对你有所帮助。 - Dan
显示剩余3条评论

0

我遇到了非常类似的错误。经过大量的探索和试探,发现它发生在一个循环周围,该循环使用Array.ofDim分配了许多数组。将其替换为Array.fill似乎已经解决了我的问题。


0

我在构建学习Scala的玩具项目1时遇到了类似的问题。我找到的一个解决方案似乎可以防止段错误,那就是将build.sbt中的Scala版本更改为2.9.1。我不确定这为什么有帮助。


非常有趣!我刚试了一下。运行几次后,我现在得到了一个不同的错误,但现在又回到了旧的错误。请查看原帖获取新错误信息。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接