【问题标题】:Can you remotely debug Graal.js script running inside Graal JVM?你可以远程调试在 Graal JVM 中运行的 Graal.js 脚本吗?
【发布时间】:2019-11-26 14:32:50
【问题描述】:

我在 Graal JVM (graalvm-ce-java8-19.3.0) 上运行 Java 程序,并在该程序中通过 Graal.js 引擎运行 JS 脚本。我想为那个 JS 脚本(不是 Java 程序)配置远程调试连接。我已经发现 Graal has support for that 可以通过 Chrome DevTools 协议/标准进行调试。

文档解释了如何使用独立的 Graal.js 解释器,但 also says 表示您可以在 JVM 中使用相同的选项,方法是在它们前面加上 -Dpolyglot

所以你需要使用-Dpolyglot.inspect,而不是--inspect

java -Dpolyglot.inspect=9229 -jar app.jar

这非常适合本地调试 - 所有这些都如 herehere 所述。

现在我尝试通过设置-Dpolyglot.inspect=exampleHost:9229 将其用于远程调试,其中exampleHost 解析为我的外部IP。不幸的是,这个设置会阻止 Graal.js 引擎正确初始化。没有太多关于真正错误的迹象,只有 stderr 上的这个消息:

ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: 
Provider com.oracle.truffle.js.scriptengine.GraalJSEngineFactory could not be instantiated

是否表示不支持远程配置? 这里有什么问题?

【问题讨论】:

    标签: java remote-debugging graalvm graaljs


    【解决方案1】:

    事实证明,对于远程连接,Graal 默认希望使用安全调试通道,因此您需要通过 -Dpolyglot.inspect.Secure=false 禁用它或使用 -Dpolyglot.inspect.KeyStore* switches 正确配置。

    至于我的情况是不需要安全性,所以我的配置变成了:

        java -Dpolyglot.inspect=exampleHost:9229 -Dpolyglot.inspect.Secure=false -jar app.jar
    

    我只需要将 exampleHost:9229 添加到 chrome://inspect/#devices -> 配置...

    远程调试有效!

    TL;DR

    这是我如何找到配置问题的原因。在其他类似情况下可能会有用。

    我调试了有问题的 Java 程序以查看在 ScriptEngineManager 中发生了什么样的问题,我在包含消息“ScriptEngineManager providers.next():”的行中的 javax.script.ScriptEngineManager#initEngines 中放置了一个断点。事实证明,这个类有一个内部 DEBUG 常量硬编码为 false,这会阻止将任何堆栈跟踪打印到 stderr。我手动将异常转储到 stderr:

     oracle.truffle.js.scriptengine.GraalJSEngineFactory could not be instantiated
        at java.util.ServiceLoader.fail(ServiceLoader.java:232)
        at java.util.ServiceLoader.access$100(ServiceLoader.java:185)
        at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
        at java.util.ServiceLoader$LazyIterator.access$700(ServiceLoader.java:323)
        at java.util.ServiceLoader$LazyIterator$2.run(ServiceLoader.java:407)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:409)
        at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
        at javax.script.ScriptEngineManager.initEngines(ScriptEngineManager.java:122)
        at javax.script.ScriptEngineManager.init(ScriptEngineManager.java:84)
        at javax.script.ScriptEngineManager.<init>(ScriptEngineManager.java:61)
        ...
     Caused by: org.graalvm.polyglot.PolyglotException: Starting inspector on exampleHost:9229 failed: Use options to specify the keystore
        at org.graalvm.polyglot.Engine$Builder.build(Engine.java:506)
        at com.oracle.truffle.js.scriptengine.GraalJSEngineFactory.<init>(GraalJSEngineFactory.java:95)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at java.lang.Class.newInstance(Class.java:442)
        at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
        ... 17 more
    

    现在这只是找出如何设置或禁用所需密钥库的问题。

    【讨论】:

      猜你喜欢
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      相关资源
      最近更新 更多