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,有需要的可以向我索取。

调试D2JS的更多相关文章

  1. C# Web应用调试开启外部访问

    在用C#开发Web应用时有个痛点,就是本机用VS开启Web应用调试时外部机器无法访问此Web应用.这里将会介绍如何通过设置允许局域网和外网机器访问本机的Web应用. 目录 1. 设置内网访问 2. 设 ...

  2. NodeJs之调试

    关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...

  3. 微信公众号开发之VS远程调试

    目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流 ...

  4. 写出易调试的SQL(修订版)

    h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...

  5. tomcat开发远程调试端口以及利用eclipse进行远程调试

    一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里:  SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...

  6. Hawk 4.7 单步调试

    单步调试的意义 已经编写的工作流,可能会因为某些外界环境的变化而出错,此时需要排除错误,我们可以使用单步调试. 单步调试的本质,相当于只使用前n个模块,这样就能看到每个步骤下,流的改变. 例子 还是上 ...

  7. Visual Studio 2012远程调试中遇到的问题

    有的时候开发环境没问题的代码在生产环境中会某些开发环境无法重现的问题,或者需要对生产环境代码进行远程调试该怎么办? Vs已经提供给开发者远程调试的工具 下面简单讲讲该怎么用,前期准备:1.本地登录账户 ...

  8. iOS逆向工程之Hopper+LLDB调试第三方App

    LLDB是Low Level Debugger的简称,在iOS开发的调试中LLDB是经常使用的,LLDB是Xcode内置的动态调试工具.使用LLDB可以动态的调试你的应用程序,如果你不做其他的额外处理 ...

  9. 写出易调试的SQL

    h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...

随机推荐

  1. Java程序设计之Constructor

    插入段代码,下次回忆吧. 先新建一个Person类,代码如下: public class Person { private String name ; private int age; public ...

  2. 国际化(Internationalization)

    1:什么是国际化? 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有的与语言,国家/地区和文化相关的元素.换言之,应用程序的功 ...

  3. Java泛型及实践

    代码及说明: package com.zsm.crazyjava; import java.util.ArrayList; import java.util.Collection; import ja ...

  4. [转载]Web前端开发工程师编程能力飞升之路

    [背景] 如果你是刚进入web前端研发领域,想试试这潭水有多深,看这篇文章吧:如果你是做了两三年web产品前端研发,迷茫找不着提高之路,看这篇文章吧:如果你是四五年的前端开发高手,没有难题能难得住你的 ...

  5. call和apply的区别

    call和apply都属于function prototype的一个方法. 定义:调用一个方法的对象,以另一个对象替换当前对象. 相同点:两个方法产生的作用是一样的. 不同点:方法传递的参数不同. c ...

  6. 关于 redis、memcache、mongoDB 的对比

    从以下几个维度,对 redis.memcache.mongoDB 做了对比. 1.性能 都比较高,性能对我们来说应该都不是瓶颈. 总体来讲,TPS 方面 redis 和 memcache 差不多,要大 ...

  7. QQ,微信第三方登陆

    感觉越是大公司的SDK越不好用,其实我也是一直在想为什么他们拿那么高的工资却干着不相应的事儿. 下面说下QQ和微信第三方登陆的一点坑 首先 (QQ互联)自带的sdk中  一个文件工程没有调用产生关联错 ...

  8. Linux系统调用和库函数调用的区别

    Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思 ...

  9. web框架django初探

    Web框架介绍 一般会分为两部分:服务器程序和应用程序.服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理.应用程序则负责具体的逻辑处理.为了方便应用程序的开发,就出 ...

  10. 测试ajax发送数据时在控制台看不到请求信息

    都是因为我把alert(xmlhttp);alert(url);打印测试数据放到了xmlhttp.open("GET",url,true);之前,导致后面的发送请求不执行了!