Liebe Threader,
ich bin jetzt seit einer Weile dabei, mich mit dem JDI zu befassen, das in Java integriert ist. Mein Ziel ist es, einen kleinen eigenen Debugger zu bauen, den ich hinterher hoffentlich je nach Projekt modifizieren kann.. Das Grundgerüst steht auch schon:
Die benutzte Klasse RedirectedStream enthält Folgendes:
Leider gibt mir das Programm, wenn ich es ausführe und die Datei "DebugDummy" übergebe (diese liegt im gleichen Verzeichnis wie StateExaminer.class), eine NoClassDefNotFoundException zurück, wenn die erzeugte Mirror-VM versucht, diese zu laden -.- Kann mir jemand helfen, den Fehler zu beheben?
Hier noch DebugDummy.class:
ich bin jetzt seit einer Weile dabei, mich mit dem JDI zu befassen, das in Java integriert ist. Mein Ziel ist es, einen kleinen eigenen Debugger zu bauen, den ich hinterher hoffentlich je nach Projekt modifizieren kann.. Das Grundgerüst steht auch schon:
Java:
class StateExaminer
{
static boolean _connected = false;
public StateExaminer (String sClassName)
{
EventQueue eventQueue;
LaunchingConnector lconnector = Bootstrap.virtualMachineManager ().defaultConnector ();
Map<String, Argument> launchingArgs = lconnector.defaultArguments ();
VirtualMachine vm;
Argument mainArg = launchingArgs.get ("main");
mainArg.setValue (sClassName);
for (String sKey: launchingArgs.keySet ())
{
System.out.println (sKey + ": " + launchingArgs.get (sKey));
}
try
{
vm = lconnector.launch (launchingArgs);
vm.setDebugTraceMode (VirtualMachine.TRACE_EVENTS);
_connected = true;
new RedirectedStream (vm.process ().getErrorStream ());
new RedirectedStream (vm.process ().getInputStream ());
EventRequestManager eventManager = vm.eventRequestManager ();
ClassPrepareRequest classPrepare = eventManager.createClassPrepareRequest ();
classPrepare.setSuspendPolicy (EventRequest.SUSPEND_EVENT_THREAD);
classPrepare.enable ();
MethodExitRequest methodExit = eventManager.createMethodExitRequest ();
methodExit.setSuspendPolicy (EventRequest.SUSPEND_EVENT_THREAD);
methodExit.enable ();
ExceptionRequest exception = eventManager.createExceptionRequest (null, true, true);
exception.setSuspendPolicy (EventRequest.SUSPEND_EVENT_THREAD);
exception.enable ();
eventQueue = vm.eventQueue ();
vm.resume ();
while (_connected)
{ EventSet eventSet = eventQueue.remove ();
for (EventIterator it = eventSet.eventIterator (); it.hasNext ();)
{
Event event = it.next ();
if (event instanceof MethodExitEvent)
{
// MethodExitEvent meEvt = (MethodExitEvent) event;
// Noch zu erweiternder Code
}
else if (event instanceof ClassPrepareEvent)
{
ClassPrepareEvent cpEvt = (ClassPrepareEvent) event;
System.out.println ("Loading " + cpEvt.referenceType ().name ());
}
else if (event instanceof ExceptionEvent)
{
ExceptionEvent excEvt = (ExceptionEvent) event;
System.out.println ("Error: " + excEvt);
}
else if (event instanceof VMDisconnectEvent)
{
System.out.println ("VM disconnected");
_connected = false;
}
}
if (_connected)
{
eventSet.resume ();
}
}
}
catch (Exception exc)
{
System.out.println (exc);
}
}
/**
* Liefert den Status der Verbindung zwischen Debugger-JVM und Mirror-JVM
* @return
*/
public static boolean getConnection ()
{
return _connected;
}
}
Die benutzte Klasse RedirectedStream enthält Folgendes:
Java:
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
class RedirectedStream extends Thread
{
InputStreamReader in;
OutputStreamWriter out;
public RedirectedStream (InputStream in)
{
super ();
this.in = new InputStreamReader (in);
out = new OutputStreamWriter (System.out);
start ();
}
public void run ()
{
while (StateExaminer.getConnection ())
{
char[] cBuf = new char[1024];
try
{
while (in.read (cBuf) > 0)
{
out.write (cBuf);
}
}
catch (IOException e)
{
System.out.println ("Could not read from/write to stream");
}
}
}
}
Leider gibt mir das Programm, wenn ich es ausführe und die Datei "DebugDummy" übergebe (diese liegt im gleichen Verzeichnis wie StateExaminer.class), eine NoClassDefNotFoundException zurück, wenn die erzeugte Mirror-VM versucht, diese zu laden -.- Kann mir jemand helfen, den Fehler zu beheben?
Hier noch DebugDummy.class:
Java:
class DebugDummy
{
public static void main (String[] args)
{
int foo = 42;
String bar = " ist die Antwort:";
System.out.println (foo + bar);
for (int i = 0; i < 42; i++)
{
System.out.println (i + 1);
}
}
}
Zuletzt bearbeitet: