2009-04-15 22 views
29

我使用jdi接口來創建一個調試器,當我使用MethodEntryRequests來啓用方法入口跟蹤時,調試程序減慢了十倍。我爲主線程設置了過濾器,並將策略暫停到SUSPEND_EVENT_THREAD。 Classfilter是有限的,如果我打印任何收到的事件,它不會顯示超過幾十個,所以它不應該收到太多。我在本地調試,並具有followind一種命令行與調試Java程序:爲什麼調試程序在使用方法入口調試時變慢了很多?

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=y,server=y,address=1337

+0

好問題。當我使用Eclipse調試Java程序時,我注意到方法入口斷點顯着減慢了速度。我希望有人有答案! – 2009-04-20 23:32:46

+0

在最近的java版本中情況有所改善還是一樣? – WSS 2018-01-23 09:28:51

回答

30

簡短的答案是當方法條目被設置時執行運行通過解釋器。我不認爲有這個...

這是所有代碼運行在調試模式,但it was enhanced in 1.4 ...現在的情況下,現在的熱點工作'全速'調試除了方法入口和出口,觀察點以及何時單步或包含斷點的方法。

+1

它確實只有意義...... HotSpot在編譯代碼時會做各種各樣的好事來加速它(包括模糊所涉及方法之間邊界的內聯方法)。最重要的是,它是適應性的,因此在運行之間如何運行方法可以改變。絕對不是你想在調試過程中發生的事情。 – Ichorus 2009-04-27 14:38:53

5

我會假設,調試器需要喚醒每一個方法調用,看它是否符合一個( s)被選中打破。因爲它必須在可執行之前檢查每個可能匹配的方法調用,因此比不必執行所有這些檢查要慢很多。

9

2個原因:

  1. 它必須在每個方法進入 添加檢查(沒有選項來調整隻是一些方法)
  2. 方法內聯不可能 (這麼小方法運行10-100倍慢)

同去探查和.NET應用程序

相關問題