Debugging 调用JDI invokeMethod()时发生TimeoutException
我正在开发定制的调试器作为eclipse插件。为此,我正在使用JPDAAPI。我想检索某个对象引用变量的值。因此,我尝试通过调用toString()方法来使用。我的代码如下: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>
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()会等待挂起的程序直到时间输出
解决方案是禁用设置步骤请求。之后,最后期限锁定问题消失了