0

Я разрабатываю свой настроенный отладчик как плагин eclipse. Для этого я использую API JPDA. Я хотел бы получить значение некоторой переменной объекта-ссылки. Поэтому я пытаюсь использовать ObjectReference.invokeMethod, вызывая метод toString(). Мой код выглядит следующим образом:TimeoutException возникло при вызове JDI invokeMethod()

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

} 

Однако, это когда-то не работает. Например, Учитывая следующий код:

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

Он отлично работает в строке 4, я могу успешно получить результат, вызывая метод ToString() из вставки переменных. Однако, когда в строке 5 сообщается об исключении TimeOutException. Тем не менее, я уже установил параметр таймаута при запуске JVM в 10 секунд, поэтому я думаю, что такой период достаточно длинный, чтобы получить результат вызова метода toString(). Трассировочный стек выглядит следующим образом. Есть ли у вас какое-либо представление о проблеме? Благодаря!

org.eclipse.jdi.TimeoutException: Тайм-аут произошел во время ожидания пакета 586. на org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply (PacketReceiveManager.java:186) на org.eclipse.jdi. internal.connect.PacketReceiveManager.getReply (PacketReceiveManager.java:197) at org.eclipse.jdi.internal.MirrorImpl.requestVM (MirrorImpl.java:191) at org.eclipse.jdi.internal.MirrorImpl.requestVM (MirrorImpl. Java: 226) на org.eclipse.jdi.internal.ObjectReferenceImpl.invokeMethod (ObjectReferenceImpl.java:428) в microbat.codeanalysis.runtime.variable.VariableValueExtractor.setMessageValue (VariableValueExtractor.java:518)

ответ

0

Я решил эту проблему самостоятельно. Я разделяю решение в этом ответе следующим образом:

Исключение Timeout вызвано тупиковой ситуацией. Когда я посещаю метод toString(), он запускает запрос шага к JVM. Тем не менее, моя программа прослушивает любой запрос шага, отправленный из отлаженной программы, чтобы он мог захватить событие шага и приостановить программу для проверки значений переменных. Поэтому программный вызов метода toString() приостанавливает саму программу, invokeMethod() ожидает приостановленную программу до выхода времени.

Решение состоит в том, чтобы отключить запрос заданного шага. После этого проблема блокировки крайнего срока исчезает.