使用方法入口调试时,为什么调试程序会减慢这么多?

时间:2009-04-15 10:43:40

标签: java debugging jdi

我正在使用jdi接口来创建调试器,当我使用MethodEntryRequests启用方法条目跟踪时,调试程序的速度减慢了几十倍。我为主线程设置了过滤器,并将策略暂停到SUSPEND_EVENT_THREAD。 Classfilter是有限的,如果我打印任何收到的事件,它不会显示超过几十个,所以它不应该收到太多。我正在本地调试并且使用调试的java程序跟随它的命令行:

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

3 个答案:

答案 0 :(得分:31)

简短的回答是,在设置方法条目时,执行会通过解释器运行。我不认为有这个... ...

以前这是在调试模式下运行的所有代码的情况,但it was enhanced in 1.4 ...现在HotSpot适用于“全速”调试,除了方法输入和退出,观察点以及单步执行时或者在包含断点的方法中。

答案 1 :(得分:11)

2个原因:

  1. 必须在每个方法条目上添加检查 (没有选择调整一些方法)
  2. 方法内联变得不可能 (所以小方法运行速度慢10-100倍)
  3. 同样适用于分析器和.net应用程序

答案 2 :(得分:5)

我认为调试器需要为每个方法调用唤醒,以查看它是否与选择要中断的方法匹配。因为它必须在可执行之前检查每个方法调用潜在匹配,所以它比不必执行所有这些检查要慢得多。