Javascript 如何追踪Nashorn中的引用错误

Javascript 如何追踪Nashorn中的引用错误,javascript,java-8,nashorn,Javascript,Java 8,Nashorn,我遇到了一个问题,似乎它可能是Nashorn引擎中的某种错误,但我无法找到一个好方法来提取一个测试用例来演示它 我有一个代码块(以前是可以工作的!),大致如下: 'use strict'; function Dummy() { this.val = 'I am fubar'; this.aContainer = []; } Dummy.prototype.toString = function() { return JSON.stringify(this);}; let obj = {

我遇到了一个问题,似乎它可能是Nashorn引擎中的某种错误,但我无法找到一个好方法来提取一个测试用例来演示它

我有一个代码块(以前是可以工作的!),大致如下:

'use strict';
function Dummy() {
  this.val = 'I am fubar';
  this.aContainer = [];
}
Dummy.prototype.toString = function() { return JSON.stringify(this);};

let obj = {};
obj.aMethod = function(arg) {
  let fubar = new Dummy();
  print('Okay so far');

  fubar.aContainer.push({"some":"thing"});
  print('Still okay');
  fubar.aContainer.push({"==": [{"var": "something_else"}, fubar.val]});

  return fubar;
};

print(obj.aMethod(null));
不幸的是,使用
jss--language=es6-strict
运行此示例不会崩溃。但在我的真实代码中,我得到了以下信息:

jdk.nashorn.internal.runtime.ECMAException:ReferenceError:未定义“fubar”

如果我按以下方式更改代码,它运行良好:

'use strict';
function Dummy() {
  this.val = 'I am fubar';
  this.aContainer = [];
}
Dummy.prototype.toString = function() { return JSON.stringify(this);};

let obj = {};
obj.aMethod = function(arg) {
  let fubar = new Dummy();
  print('Okay so far');

  fubar.aContainer.push({"some":"thing"});
  print('Still okay');
  let x = fubar.val;
  fubar.aContainer.push({"==": [{"var": "something_else"}, x]});

  return fubar;
};

print(obj.aMethod(null));
我能做些什么来进一步检测真正的代码,或者追踪这个问题?奇怪的是错误在执行的很早就发生了。如果我将print()调用放在方法中的任何位置,则永远不会到达print。调用堆栈中我的代码的最后一行实际上是调用该方法的那一行

我刚刚通过自动更新获得了一个新版本的Java,但我需要看看这段代码是否在其下运行。我在控制台的当前版本是:

➜  ~ java -version
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

本文档中包含了跟踪Nashorn所能做的所有工作的完整摘要:


它描述了用于内部调试和检测目的的系统属性,以及用于相同目的的系统记录器。

我使用java版本“1.8.0_121”运行了您的第一段代码,没有任何问题。这是输出:
{“val”:“I am fubar”,“aContainer”:[{“some”:“thing”},{“==”:[{“var”:“something_else”},“I am fubar”]}
。你是怎样从工厂得到这台发动机的?我就是这样得到它的:
NashornScriptEngineFactory=new NashornScriptEngineFactory();ScriptEngine=factory.getScriptEngine(新字符串[]{--language=es6“})是的,谢谢您的尝试。不幸的是,我还不能创建一个简单的例子来展示这个问题。这让我相信,当进行某个方法调用或属性集时,我的应用程序中内存使用的某些方面导致变量被不正确地收集或提升。将变量复制到一个新实例似乎可以避免不正确的处理,但我一直在试图找到一种方法,与Nashorn团队共享相关信息,以帮助他们跟踪它。您是否尝试启用跟踪?看这个,我刚找到这个。如果它对你有帮助,请告诉我。太棒了,我会尝试使用其中的一些选项来插入我的代码。如果您想添加此信息,我很乐意将其标记为我问题的答案。