调用JDI invokeMethod()时发生TimeoutException

时间:2016-04-16 10:12:22

标签: debugging eclipse-plugin remote-debugging timeoutexception jpda

我正在开发我的自定义调试器作为eclipse插件。我正在使用JPDA API。我想检索一些对象引用变量的值。因此,我尝试通过调用toString()方法来使用ObjectReference.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行工作正常,我可以通过调用 insert 变量的toString()方法成功获得结果。但是,在第5行中,会报告TimeOutException。但是,我已经在10秒启动JVM时设置了超时选项,因此我认为这段时间足以检索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)     at org.eclipse.jdi.internal.ObjectReferenceImpl.invokeMethod(ObjectReferenceImpl.java:428)     at microbat.codeanalysis.runtime.variable.VariableValueExtractor.setMessageValue(VariableValueExtractor.java:518)

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。我在这个答案中分享了如下解决方案:

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

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