This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[RFA/JDWP] Add startup code
- From: Keith Seitz <keiths at redhat dot com>
- To: Java Patch List <java-patches at gcc dot gnu dot org>
- Date: Wed, 23 Aug 2006 17:36:20 -0700
- Subject: [RFA/JDWP] Add startup code
Hi,
This patch adds just about everything needed to startup the JDWP
backend, including VM_INIT and VM_DEATH.
Trying to run this won't really do anything interesting until some more
event notifications are added (coming soon to a patch list near you).
Without any of the thread suspension stuff in yet, it won't even stop
the program... (Also coming soon to a patch list near you.)
Keith
ChangeLog
2006-08-23 Keith Seitz <keiths@redhat.com>
* prims.cc (remoteDebug): New global.
(jdwpOptions): New global.
(parse_x_arg): Add processing for "X" options "debug" and
"runjdwp:"
(_Jv_RunMain): If debugging, start up JDWP backend.
Send VM_INIT and VM_DEATH when appropriate.
Index: prims.cc
===================================================================
--- prims.cc (revision 116367)
+++ prims.cc (working copy)
@@ -64,6 +64,10 @@
#include <gnu/gcj/runtime/ExtensionClassLoader.h>
#include <gnu/gcj/runtime/FinalizerThread.h>
#include <execution.h>
+#include <gnu/classpath/jdwp/Jdwp.h>
+#include <gnu/classpath/jdwp/VMVirtualMachine.h>
+#include <gnu/classpath/jdwp/event/VmDeathEvent.h>
+#include <gnu/classpath/jdwp/event/VmInitEvent.h>
#include <gnu/java/lang/MainThread.h>
#ifdef USE_LTDL
@@ -98,6 +102,10 @@
const char **_Jv_argv;
int _Jv_argc;
+// Debugging options
+static bool remoteDebug = false;
+static char *jdwpOptions = "";
+
// Argument support.
int
_Jv_GetNbArgs (void)
@@ -1138,8 +1146,19 @@
}
else if (! strcmp (option_string, "debug"))
{
- // FIXME: add JDWP/JVMDI support
+ remoteDebug = true;
}
+ else if (! strncmp (option_string, "runjdwp:", 8))
+ {
+ if (strlen (option_string) > 8)
+ jdwpOptions = &option_string[8];
+ else
+ {
+ fprintf (stderr,
+ "libgcj: argument required for JDWP options");
+ return -1;
+ }
+ }
else if (! strncmp (option_string, "bootclasspath:", 14))
{
// FIXME: add a parse_bootclasspath_arg function
@@ -1519,6 +1538,26 @@
else
main_thread = new MainThread (JvNewStringUTF (name),
arg_vec, is_jar);
+ _Jv_AttachCurrentThread (main_thread);
+
+ // Start JDWP
+ if (remoteDebug)
+ {
+ using namespace gnu::classpath::jdwp;
+ VMVirtualMachine::initialize ();
+ Jdwp *jdwp = new Jdwp ();
+ jdwp->setDaemon (true);
+ jdwp->configure (JvNewStringLatin1 (jdwpOptions));
+ jdwp->start ();
+
+ // Wait for JDWP to initialize and start
+ jdwp->join ();
+ }
+
+ // Send VmInit
+ gnu::classpath::jdwp::event::VmInitEvent *event;
+ event = new gnu::classpath::jdwp::event::VmInitEvent (main_thread);
+ gnu::classpath::jdwp::Jdwp::notify (event);
}
catch (java::lang::Throwable *t)
{
@@ -1531,9 +1570,16 @@
::exit (1);
}
- _Jv_AttachCurrentThread (main_thread);
_Jv_ThreadRun (main_thread);
+ // Notify deubgger of VM's death
+ if (gnu::classpath::jdwp::Jdwp::isDebugging)
+ {
+ using namespace gnu::classpath::jdwp;
+ event::VmDeathEvent *event = new event::VmDeathEvent ();
+ Jdwp::notify (event);
+ }
+
// If we got here then something went wrong, as MainThread is not
// supposed to terminate.
::exit (1);