Debugging 调用JDI invokeMethod()时发生TimeoutException

Debugging 调用JDI invokeMethod()时发生TimeoutException,debugging,eclipse-plugin,remote-debugging,timeoutexception,jpda,Debugging,Eclipse Plugin,Remote Debugging,Timeoutexception,Jpda,我正在开发定制的调试器作为eclipse插件。为此,我正在使用JPDAAPI。我想检索某个对象引用变量的值。因此,我尝试通过调用toString()方法来使用。我的代码如下: if(thread.isSuspended()){ Method method = retriveToStringMethod(...); Value messageValue = objValue.invokeMethod(thread, method, new ArrayList<Value>

我正在开发定制的调试器作为eclipse插件。为此,我正在使用JPDAAPI。我想检索某个对象引用变量的值。因此,我尝试通过调用toString()方法来使用。我的代码如下:

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

}
它在第4行工作正常,我可以通过调用insert变量的toString()方法成功地获得结果。但是,在第5行中,会报告TimeOutException。但是,我已经在10秒启动JVM时设置了timeout选项,因此我认为这样的时间段足够长,可以检索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) 位于org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191) 位于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)

我自己解决了这个问题。我同意这个答案中的解决方案如下:

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

}
TimeoutException是由死锁引起的。当我访问toString()方法时,它会触发对JVM的step请求。但是,我的程序正在侦听调试程序发送的任何step请求,以便能够捕获step事件并挂起程序以检查变量值。因此,对toString()方法的编程调用会挂起程序本身,invokeMethod()会等待挂起的程序直到时间输出

解决方案是禁用设置步骤请求。之后,最后期限锁定问题消失了