0

Ich entwickle meinen benutzerdefinierten Debugger als Eclipse-Plugin. Ich verwende die JPDA API zu diesem Zweck. Ich möchte den Wert einiger Objektreferenzvariablen abrufen. Daher versuche ich ObjectReference.invokeMethod durch Aufrufen der toString() -Methode zu verwenden. Mein Code ist wie folgt:TimeoutException beim Aufruf von JDI invokeMethod() aufgetreten

if(thread.isSuspended()){ 
    Method method = retriveToStringMethod(...); 
    Value messageValue = objValue.invokeMethod(thread, method, new ArrayList<Value>(), ObjectReference.INVOKE_SINGLE_THREADED); 
    stringValue = messageValue.toString(); 

} 

Allerdings funktioniert es manchmal nicht. Zum Beispiel den folgenden Code Gegeben:

1. public static void main(String[] args) { 
2. InsertIntervalBug6 insert = new InsertIntervalBug6(); 
3. 
4. Interval i1 = new Interval(1, 2); 
5. Interval i2 = new Interval(3, 4); 
6. 
7. } 

Es ist in Zeile 4 gut funktioniert, kann ich erfolgreich das Ergebnis erhalten, indem toString() -Methode des Einsatz Aufruf variabel. In Zeile 5 wird jedoch eine TimeOutException gemeldet. Allerdings habe ich bereits beim Starten von JVM um 10s die Timeout-Option gesetzt, daher denke ich, dass ein solcher Zeitraum lang genug ist, um das Ergebnis des Aufrufs der toString() -Methode abzurufen. Der Ablaufverfolgungsstapel ist wie folgt. Hast du eine Ahnung von dem Problem? Vielen Dank!

org.eclipse.jdi.TimeoutException: Timeout aufgetreten ist, während für die Paketwarte 586. bei org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply (PacketReceiveManager.java:186) bei org.eclipse.jdi. internal.connect.PacketReceiveManager.getReply (PacketReceiveManager.java:197) bei org.eclipse.jdi.internal.MirrorImpl.requestVM (MirrorImpl.java:191) bei org.eclipse.jdi.internal.MirrorImpl.requestVM (MirrorImpl. Java: 226) bei org.eclipse.jdi.internal.ObjectReferenceImpl.invokeMethod (ObjectReferenceImpl.java:428) bei microbat.codeanalysis.runtime.variable.VariableValueExtractor.setMessageValue (VariableValueExtractor.java:518)

Antwort

0

Ich habe dieses Problem selbst gelöst. Ich teile die Lösung in dieser Antwort wie folgt:

Die TimeoutException wird durch Deadlock verursacht. Wenn ich die Methode toString() besuche, löst sie eine Schrittanforderung an JVM aus. Mein Programm hört jedoch jede Schrittanforderung ab, die vom debugged-Programm gesendet wird, so dass es in der Lage ist, das Stepper-Ereignis zu erfassen und das Programm zum Überprüfen von Variablenwerten auszusetzen. Ein programmatischer Aufruf der toString() - Methode unterbricht daher das Programm selbst, und invokeMethod() wartet das angehaltene Programm bis zur Ausgabe der Zeit.

Die Lösung besteht darin, die eingestellte Schrittanforderung zu deaktivieren. Danach verschwindet das Deadline-Lock-Problem.