0

我正在開發自定義調試器作爲eclipse插件。爲此,我正在使用JPDA API。我想檢索一些對象引用變量的值。因此,我嘗試通過調用toString()方法來使用ObjectReference.invokeMethod。我的代碼如下:調用JDI時發生TimeoutException 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號線正常工作,我能成功獲得通過調用插入變量的toString()方法的結果。但是,在第5行中,會報告TimeOutException。不過,我已經在10秒啓動JVM時設置了超時選項,因此我認爲這樣的時間足夠長以檢索toString()方法調用的結果。跟蹤堆棧如下。你對這個問題有什麼想法嗎?謝謝!

org.eclipse.jdi.TimeoutException:同時在org.eclipse.jdi在org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:186) 等待分組586 發生超時。在org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191) 處的org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl。)處使用internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:197) 。的java:226) 在org.eclipse.jdi.internal.ObjectReferenceImpl.invokeMethod(ObjectReferenceImpl.java:428) 在microbat.codeanalysis.runtime.variable.VariableValueExtractor.setMessageValue(VariableValueExtractor.java:518)

回答

0

我自己解決了這個問題。我在這個答案中共享解決方案如下:

TimeoutException是由死鎖引起的。當我訪問toString()方法時,它觸發對JVM的步驟請求。但是,我的程序正在偵聽從調試程序發送的任何步驟請求,以便它能夠捕獲步進事件並暫停程序以檢查變量值。因此,toString()方法的程序調用暫停程序本身,invokeMethod()等待暫停的程序直到時間輸出。

解決方法是禁用設置的步驟請求。之後,截止日期鎖定問題消失。

相關問題