changeset 21983:b8dffa0113ca

Allows debugging and executing any project's unittest from inside of NetBeans. Added --attach localhost:8000 option to allow the JVM to attach to IDE's (and any other) JPDA server.
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Fri, 26 Jun 2015 15:51:50 +0200
parents 6691b182e1a1
children de52ea7de779
files mxtool/mx.py truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java
diffstat 2 files changed, 56 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mxtool/mx.py	Fri Jun 26 14:47:52 2015 +0200
+++ b/mxtool/mx.py	Fri Jun 26 15:51:50 2015 +0200
@@ -1703,6 +1703,7 @@
         self.add_argument('-p', '--primary-suite-path', help='set the primary suite directory', metavar='<path>')
         self.add_argument('--dbg', type=int, dest='java_dbg_port', help='make Java processes wait on <port> for a debugger', metavar='<port>')
         self.add_argument('-d', action='store_const', const=8000, dest='java_dbg_port', help='alias for "-dbg 8000"')
+        self.add_argument('--attach', dest='attach', help='Connect to existing server running at [<address>:]<port>')
         self.add_argument('--backup-modified', action='store_true', help='backup generated files if they pre-existed and are modified')
         self.add_argument('--cp-pfx', dest='cp_prefix', help='class path prefix', metavar='<arg>')
         self.add_argument('--cp-sfx', dest='cp_suffix', help='class path suffix', metavar='<arg>')
@@ -2344,8 +2345,15 @@
         self.version = VersionSpec(version.split()[2].strip('"'))
         self.javaCompliance = JavaCompliance(self.version.versionString)
 
-        if _opts.java_dbg_port is not None:
-            self.java_args += ['-Xdebug', '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=' + str(_opts.java_dbg_port)]
+        attach = None
+        if _opts.attach is not None:
+            attach = 'server=n,address=' + _opts.attach
+        else:
+            if _opts.java_dbg_port is not None:
+                attach = 'server=y,address=' + str(_opts.java_dbg_port)
+
+        if attach is not None:
+            self.java_args += ['-Xdebug', '-Xrunjdwp:transport=dt_socket,' + attach + ',suspend=y']
 
     def _init_classpaths(self):
         if not self._classpaths_initialized:
@@ -2653,8 +2661,16 @@
                     self.logCompilation('javac' if not args.alt_javac else args.alt_javac)
                     javacCmd = [javac, '-g', '-J-Xmx1g', '-source', compliance, '-target', compliance, '-classpath', cp, '-d', outputDir]
                     jdk.javacLibOptions(javacCmd)
-                    if _opts.java_dbg_port is not None:
-                        javacCmd += ['-J-Xdebug', '-J-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=' + str(_opts.java_dbg_port)]
+
+                    attach = None
+                    if _opts.attach is not None:
+                        attach = 'server=n,address=' + _opts.attach
+                    else:
+                        if _opts.java_dbg_port is not None:
+                            attach = 'server=y,address=' + str(_opts.java_dbg_port)
+
+                    if attach is not None:
+                        javacCmd += ['-J-Xdebug', '-J-Xrunjdwp:transport=dt_socket,' + attach + ',suspend=y']
                     javacCmd += processorArgs
                     javacCmd += ['@' + _cygpathU2W(argfile.name)]
 
@@ -4468,6 +4484,33 @@
     out.close('target')
     out.open('target', {'name' : 'jar', 'depends' : 'compile'})
     out.close('target')
+    out.open('target', {'name' : 'run', 'depends' : 'compile'})
+    out.open('exec', {'executable' : sys.executable, 'failonerror' : 'true'})
+    out.element('env', {'key' : 'JAVA_HOME', 'value' : jdk.jdk})
+    out.element('arg', {'value' : os.path.abspath(__file__)})
+    out.element('arg', {'value' : 'unittest'})
+    out.element('arg', {'value' : p.name})
+    out.close('exec')
+    out.close('target')
+    out.open('target', {'name' : 'debug', 'depends' : 'init,compile'})
+    out.open('nbjpdastart', {'addressproperty' : 'jpda.address', 'name' : p.name, })
+    out.open('classpath')
+    out.element('path', {'path' : '${javac.classpath}'})
+    out.close('classpath')
+    out.open('sourcepath')
+    out.element('pathelement', {'location' : 'src'})
+    out.close('sourcepath')
+    out.close('nbjpdastart')
+    out.open('exec', {'executable' : sys.executable, 'failonerror' : 'true'})
+    out.element('env', {'key' : 'JAVA_HOME', 'value' : jdk.jdk})
+    out.element('arg', {'value' : os.path.abspath(__file__)})
+    out.element('arg', {'value' : '-d'})
+    out.element('arg', {'value' : '--attach'})
+    out.element('arg', {'value' : '${jpda.address}'})
+    out.element('arg', {'value' : 'unittest'})
+    out.element('arg', {'value' : p.name})
+    out.close('exec')
+    out.close('target')
     out.open('target', {'name' : 'javadoc'})
     out.open('exec', {'executable' : sys.executable, 'failonerror' : 'true'})
     out.element('env', {'key' : 'JAVA_HOME', 'value' : jdk.jdk})
@@ -4589,7 +4632,7 @@
 javadoc.use=true
 javadoc.version=false
 javadoc.windowtitle=
-main.class=
+main.class=com.oracle.truffle.api.impl.Accessor
 manifest.file=manifest.mf
 meta.inf.dir=${src.dir}/META-INF
 mkdist.disabled=false
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Fri Jun 26 14:47:52 2015 +0200
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Fri Jun 26 15:51:50 2015 +0200
@@ -124,4 +124,12 @@
         throw new IOException("No symbol invoker found!");
     }
 
+    /**
+     * Don't call me. I am here only to let NetBeans debug any Truffle project.
+     * 
+     * @param args
+     */
+    public static void main(String... args) {
+        throw new IllegalStateException();
+    }
 }