Как прервать длительный запуск метода ignoreMethod на com.sun.jdi.ObjectReference?JAVA

Программисты JAVA общаются здесь
Anonymous
Как прервать длительный запуск метода ignoreMethod на com.sun.jdi.ObjectReference?

Сообщение Anonymous »

У меня есть собственный отладчик JDI, который вызывает метод toString для некоторых объектов:

Код: Выделить всё

com.sun.jdi.ObjectReferenceobject object = ...
ThreadReference threadRef = frameProxy.threadProxy().getThreadReference();
Value value = object.invokeMethod(threadRef, toStringMethod,
Collections.EMPTY_LIST, ObjectReference.INVOKE_SINGLE_THREADED);
Проблема в том, что даже если внутри метода toString() не установлены точки останова, метод вызова никогда не завершается, поэтому мой отладчик зависает. Например, это происходит, когда я вызываю это для объекта Double.
Как я могу прекратить выполнение вызова метода по истечении некоторого времени?
Обновление: я попытался реализовать свой собственный объект Double и поместил несколько операторов System.out.println() в начало и конец toString. () и казалось, что метод выполняется нормально, но по какой-то причине отладчик не получает результат. Возможно, это ошибка в JDI, поскольку таких ошибок много, но я не ищу решение этой проблемы, я просто ищу способ прервать выполнение вызова метода() если это займет слишком много времени.
Update2: Я попробовал то, что предлагал ThierryB, но могу вызвать только FrameProxy.threadProxy( ).stop(object); в потоке менеджера. А поток менеджера заблокирован из-за вызоваМетод(), поэтому он не выполнит мою команду. Я попробовал что-то вроде этого:

Код: Выделить всё

boolean[] isFinished = new boolean[2];
isFinished[0] = false;

DebuggerManagerThreadImpl managerThread = debugProcess.getManagerThread();
new Thread(() - > {
try {
Thread.sleep(2000);
if (!isFinished[0]) {
System.out.println("Invoked");
managerThread.invokeCommand(new DebuggerCommand() {
@Override
public void action() {
try {
frameProxy.threadProxy().stop(object);
} catch (InvalidTypeException e) {
e.printStackTrace();
}
int threadStatus = frameProxy.threadProxy().status();
switch (threadStatus) {
case ThreadReference.THREAD_STATUS_RUNNING:
System.out.println("The thread is running.");
break;
case ThreadReference.THREAD_STATUS_ZOMBIE:
System.out.println("The thread has been completed.");
break;
case ThreadReference.THREAD_STATUS_WAIT:
System.out.println("The thread is waiting.");
break;
default:
System.out.println("The thread is not running / not waiting / not completed : but what is it doing right now ? (a little programmer joke ;) )");
}
}

@Override
public void commandCancelled() {

}
});
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();

Value value = object.invokeMethod(threadRef, toStringMethod,
Collections.EMPTY_LIST, ObjectReference.INVOKE_SINGLE_THREADED);

isFinished[0] = true;
ноframeProxy.threadProxy().stop(object); никогда не выполняется, поскольку метод действия DebuggerCommand не вызывается (поток заблокирован ).
Также это трассировка стека, когда мой отладчик зависает, и я принудительно останавливаю процесс:

Код: Выделить всё

com.sun.jdi.VMDisconnectedException
at com.jetbrains.jdi.TargetVM.waitForReply(TargetVM.java:317)
at com.jetbrains.jdi.VirtualMachineImpl.waitForTargetReply(VirtualMachineImpl.java:1170)
at com.jetbrains.jdi.PacketStream.waitForReply(PacketStream.java:86)
at com.jetbrains.jdi.JDWP$ObjectReference$InvokeMethod.waitForReply(JDWP.java:4840)
at com.jetbrains.jdi.ObjectReferenceImpl.invokeMethod(ObjectReferenceImpl.java:413)
ОБНОВЛЕНИЕ 3: какой поток использовать для вызова метода? В настоящее время я использую FrameProxy.threadProxy().getThreadReference();, который большую часть времени работает нормально, но лучше ли создать отдельный поток только для вызова методов объектов (вместе с моим отладчиком JDI у меня также есть агент инструментирования внутри приложения, чтобы я мог создать отдельный поток только для этого варианта использования (может быть, это предотвратит взаимоблокировки?)).
ОБНОВЛЕНИЕ 4: В настоящее время я я использую SUSPEND_ALL в качестве политики приостановки, лучше ли вместо этого использовать SUSPEND_EVENT_THREAD?

Подробнее здесь: https://stackoverflow.com/questions/634 ... treference

Вернуться в «JAVA»