我正在开发我的自定义调试器作为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)
答案 0 :(得分:0)
我自己解决了这个问题。我在这个答案中分享了如下解决方案:
TimeoutException是由死锁引起的。当我访问toString()方法时,它会触发对JVM的步骤请求。但是,我的程序正在侦听从调试程序发送的任何步骤请求,以便它能够捕获步进事件并暂停程序以检查变量值。因此,对toString()方法进行编程调用会暂停程序本身,invokeMethod()会等待暂停的程序直到输出为止。
解决方案是禁用设置步骤请求。之后,截止日期锁定问题消失了。