调试D2JS
D2JS 最终加载运行于 nashorn 上,目前能调试 nashorn js 的 IDE 只有一款:NetBeans。eclipse 没有计划,神器号称支持 nashorn,对于简单类型可以观察,对于 js 的复合类型(对象数组)神器就会错误的处理为 Java 对象(nashorn 上的 js 对象都是 java 对象)。
但是 NetBeans 代码有点业余,其硬编码了 js 文件后缀,导致 d2js、jssp 等内容为 js 后缀不为 js 的都无法调试。
之前通过猜测、NetBeans模块调试、远程调试等等方式,最终确定如下修改:
----
netbeans-8.2-201609300101-src\debugger.jpda.js\src\org\netbeans\modules\debugger\jpda\js\source\Source.java
----
LN224 : 227
int nl = name.length(); if (nl < 4 || !name.substring(nl - 3, nl).toLowerCase().equals(".js")) { name = name + ".js"; }
Remove
----
netbeans-8.2-201609300101-src\debugger.jpda\src\org\netbeans\modules\debugger\jpda\models\CallStackFrameImpl.java
----
LN330 : 347
String sourceName = getSourceName(null); int ext = sourceName.lastIndexOf('.'); if (ext > 0) { String extension = sourceName.substring(++ext); extension = extension.toUpperCase(); if (!"JAVA".equals(extension)) { // NOI18N as = Collections.singletonList(extension); s = extension; } } else { // Check Nashorn: String sourcePath = getSourcePath(null); if (sourcePath.startsWith("jdk/nashorn/internal/scripts/") || // NOI18N sourcePath.startsWith("jdk\\nashorn\\internal\\scripts\\")) { // NOI18N s = "JS"; // NOI18N as = Collections.singletonList(s); } }
MODIFY
String sourceName = getSourceName(null); int ext = sourceName.lastIndexOf('.'); String extension = null; if (ext > 0) { extension = sourceName.substring(++ext); extension = extension.toUpperCase(); } if (!"JAVA".equals(extension)) { // NOI18N // Check Nashorn: String sourcePath = getSourcePath(null); if (sourcePath.startsWith("jdk/nashorn/internal/scripts/") || // NOI18N sourcePath.startsWith("jdk\\nashorn\\internal\\scripts\\")) { // NOI18N s = "JS"; // NOI18N as = Collections.singletonList(s); } else { as = Collections.singletonList(extension); s = extension; } }
10-27日已提交到NetBeans,希望他们下个版本会加进去。
目前调试效果如下:
看起来还不错,调试器看到的代码暴露了 d2js 代码被套上的闭包和 sql 块转换生成的代码,和源文件不同。
这里不能上传 jar,有需要的可以向我索取。