prims.cc (remoteDebug): New global.

* 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.

From-SVN: r116383
This commit is contained in:
Keith Seitz 2006-08-24 18:55:53 +00:00 committed by Keith Seitz
parent c9cbfca6f5
commit b8caf93e7d
2 changed files with 57 additions and 2 deletions

View File

@ -1,3 +1,12 @@
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> 2006-08-23 Keith Seitz <keiths@redhat.com>
* gnu/classpath/jdwp/VMVirtualMachine.java * gnu/classpath/jdwp/VMVirtualMachine.java

View File

@ -64,6 +64,10 @@ details. */
#include <gnu/gcj/runtime/ExtensionClassLoader.h> #include <gnu/gcj/runtime/ExtensionClassLoader.h>
#include <gnu/gcj/runtime/FinalizerThread.h> #include <gnu/gcj/runtime/FinalizerThread.h>
#include <execution.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> #include <gnu/java/lang/MainThread.h>
#ifdef USE_LTDL #ifdef USE_LTDL
@ -98,6 +102,10 @@ property_pair *_Jv_Environment_Properties;
const char **_Jv_argv; const char **_Jv_argv;
int _Jv_argc; int _Jv_argc;
// Debugging options
static bool remoteDebug = false;
static char *jdwpOptions = "";
// Argument support. // Argument support.
int int
_Jv_GetNbArgs (void) _Jv_GetNbArgs (void)
@ -1138,7 +1146,18 @@ parse_x_arg (char* option_string)
} }
else if (! strcmp (option_string, "debug")) 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 if (! strncmp (option_string, "bootclasspath:", 14))
{ {
@ -1519,6 +1538,26 @@ _Jv_RunMain (JvVMInitArgs *vm_args, jclass klass, const char *name, int argc,
else else
main_thread = new MainThread (JvNewStringUTF (name), main_thread = new MainThread (JvNewStringUTF (name),
arg_vec, is_jar); 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) catch (java::lang::Throwable *t)
{ {
@ -1531,9 +1570,16 @@ _Jv_RunMain (JvVMInitArgs *vm_args, jclass klass, const char *name, int argc,
::exit (1); ::exit (1);
} }
_Jv_AttachCurrentThread (main_thread);
_Jv_ThreadRun (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 // If we got here then something went wrong, as MainThread is not
// supposed to terminate. // supposed to terminate.
::exit (1); ::exit (1);