【问题标题】:Method breakpoints may dramatically slow down debugging方法断点可能会大大减慢调试速度
【发布时间】:2015-06-25 22:46:24
【问题描述】:

每当向方法声明的行添加断点时(在 Intellij IDEA 或 Android Studio 中),都会出现一个弹出窗口:

方法断点可能会大大减慢调试速度

为什么它会显着减慢调试速度,是我的问题吗?将断点放在函数的第一行有什么不同?

谢谢!

【问题讨论】:

标签: java android debugging intellij-idea


【解决方案1】:

我看了一圈,在Intellij Documetation看到了这个帖子:

方法断点

方法断点响应程序进入或退出特定方法。它们让您通过您希望调查的方法而不是行号来定位您的调试会话。方法断点让您可以在方法级别跟踪程序流程以及检查进入和退出条件。请注意,使用方法断点会降低您正在调试的应用程序的速度。

我猜它会在程序进入方法之前停止程序,以便您可以在进入方法之前评估参数等。

它显着变慢的原因是(这是我可以收集到的,因为这是我在 Intellij 文档中的方法断点上可以找到的全部)它必须:

让您在方法级别跟踪程序流程以及检查进入和退出条件

我想这比仅仅停止程序的执行要花更长的时间

【讨论】:

  • 请使用您问题上的编辑链接添加更多信息。 “发布答案”按钮应仅用于问题的完整答案。
  • 问题是,在这方面,intellij 的文档非常稀少。我查看了他们的文档,并试图用我必须处理的内容尽我所能回答我的问题。这似乎是我能得到的最完整的答案
  • 我认为这确实可以作为他问题的有效答案;从help center 判断,本网站的使用完全有效。
  • @dhh 来自help center:“帮助我们通过研究问题找到解决方案,然后贡献您的研究结果以及您尝试过的任何其他内容作为部分答案。这样,即使如果我们无法弄清楚,下一个人还有更多工作要做。您也可以对问题进行投票或设置赏金,以便问题得到更多关注......任何让提问者正确的答案方向是有帮助的,但请尝试在您的回答中提及任何限制、假设或简化。"
【解决方案2】:

我的理解是,当在方法入口设置断点时,代码必须以解释方式运行(而不是使用 JIT 进行预编译?)。

如果您改为在方法的第一行设置断点,我怀疑代码中的行号索引可用于简单地将中断操作码交换为原始操作码,因此应用程序会全速运行。 (调试时对我来说仍然很慢;)

【讨论】:

    【解决方案3】:

    IntelliJ 团队有一个简单的解释:“由于 JVM 设计,方法断点会大大降低调试器的速度,评估它们的成本很高”

    https://intellij-support.jetbrains.com/hc/en-us/articles/206544799-Java-slow-performance-or-hangups-when-starting-debugger-and-stepping

    【讨论】:

    • stackoverflow.com/a/54995643/4130619 声称“此实现要求 JVM 每次 any 线程进入 any 方法以及当 any 线程退出 any 方法。"
    • 嗯,这显然是设计和/或实现:我们想知道一些细节,特别是最终会吃掉 CPU 的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2015-09-10
    • 2020-12-07
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多