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

JtR*_*JtR 33 java debugging jdi

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

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

Ich*_*rus 31

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

这曾经是在调试模式下运行的所有代码的情况,但它在1.4中得到了增强 ...现在,HotSpot适用于"全速"调试,除了方法入口和退出,观察点以及单步执行或方法时包含断点.


Mas*_*ash 11

原因2:

  1. 它必须在每个方法条目上添加检查(没有选项可以调整一些方法)
  2. 方法内联变得不可能(因此小方法运行速度慢10-100倍)

同样适用于分析器和.net应用程序

  • 因为方法内联意味着你不再拥有那个方法 - 整个它的内容将在它调用的所有地方都被包含,并且不会发生任何方法调用.但是调试器需要这种方法,因为它是它所取代的地方. (5认同)
  • 为什么方法内联变得不可能? (2认同)

lot*_*har 5

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