2017-07-30 2 views
1

J'ai rencontré un problème qui semble être une sorte de bogue dans le moteur Nashorn, mais je n'arrive pas à trouver un bon moyen de distiller un test qui le démontrera .Comment localiser une erreur ReferenceError dans Nashorn

J'ai un bloc de code (qui fonctionnait!) Qui ressemble à peu près comme ceci:

'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)); 

Malheureusement, d'exécuter cet exemple avec jss --language=es6 -strict ne tombe pas en panne. Dans mon code réel si, j'obtiens ce qui suit:

jdk.nashorn.internal.runtime.ECMAException: ReferenceError: "fubar" is not defined

Si je change le code comme suit, il fonctionne très bien:

'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)); 

Est-ce que je peux faire pour essayer d'instrumenter la code réel plus loin ou sinon suivre ce problème? La chose étrange est l'erreur se produit très tôt dans l'exécution. Si je mets un appel print() n'importe où dans la méthode, l'impression n'est jamais atteinte. La dernière ligne de mon code dans la callstack est en fait la ligne qui appelle la méthode.

J'ai simplement pris une nouvelle version de Java via la mise à jour automatique, mais j'ai besoin de voir si ce code est en cours d'exécution ou non. Ma version actuelle de la console est:

➜ ~ 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) 
+0

J'ai exécuté votre premier code avec la version java "1.8.0_121" sans aucun problème. Voici la sortie: '{" val ":" Je suis fubar "," aContainer ": [{" some ":" chose "}, {" == ": [{" var ":" something_else "}," Je suis fubar "]}]}'. Comment obtenez-vous le moteur de l'usine? Voici comment je l'obtiens: \t \t \t 'NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); ScriptEngine engine = \t factory.getScriptEngine (new String [] {"--language = es6"}); ' – Aris2World

+0

Oui, merci d'avoir essayé cela. Malheureusement, je n'ai pas été capable de créer un exemple de cas simple qui présente le problème. Cela m'amène à croire que quelque chose à propos de l'utilisation de la mémoire dans mon application provoque la collecte ou la levée incorrecte de cette variable lorsqu'un certain appel de méthode ou jeu de propriétés est effectué. Copier la variable dans une nouvelle instance semble éviter la manipulation incorrecte, mais je suis coincé en essayant de trouver un moyen de partager des informations pertinentes avec l'équipe de Nashorn pour les aider à le retrouver. – deinspanjer

+0

Avez-vous essayé d'activer le suivi? Voir ce https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-callsite_tracing – Aris2World

Répondre

1

Un résumé complet de tout ce que vous pouvez faire pour tracer Nashorn est contenu dans ce document:

jdk8u-dev/nashorn/file/tip/docs/DEVELOPER_README

Il décrit les propriétés du système qui sont utilisés pour interne débogage et instrumentation, avec les enregistreurs de système, qui sont utilisés pour la même chose.