+2006-08-24 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.
+
2006-08-23 Keith Seitz <keiths@redhat.com>
* gnu/classpath/jdwp/VMVirtualMachine.java
#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
const char **_Jv_argv;
int _Jv_argc;
+// Debugging options
+static bool remoteDebug = false;
+static char *jdwpOptions = "";
+
// Argument support.
int
_Jv_GetNbArgs (void)
}
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))
{
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)
{
::exit (1);
}
- _Jv_AttachCurrentThread (main_thread);
_Jv_ThreadRun (main_thread);
+ // Notify debugger 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);