【发布时间】:2014-10-01 08:35:36
【问题描述】:
在我过去作为 C/C++ 程序员的生活中,可以在某些平台和调试器组合上选择性地挂起线程。在遇到断点后,可以发出命令(或单击 GUI 中的内容)来对线程进行冰/除冰(挂起/唤醒)。在进一步的 step/next/run/continue 命令中,挂起的线程不会执行任何指令。
现在任何 JVM 或 Java IDE 都可以做到这一点吗?我使用 IntelliJ,但没有看到该功能,也无法通过 Google 找到任何信息。
澄清一下:
- 我不是在询问断点的线程策略,例如,暂停当前线程或所有线程。我知道 JVM 调试器功能。
- 开发环境很普通:我使用 IntelliJ Java IDE,并且可以访问相关源代码。
最后,我意识到“Java 调试器”是一个有点模糊的术语。 AFAIK,Sun 发布了调试器用来与 JVM 通信的在线调试格式。也许每个 JVM(IBM vs Sun vs IcedTea vs ???)都支持不同的调试功能,但我只熟悉 Sun/Oracle JVM。
【问题讨论】:
-
嗨,kevin,您是否可以控制正在运行的代码,这只是一个特定点吗?因为如果您准备修改代码,您可以使用
boolean threadSuspended和if (!threadSuspended)模式,并在调试器中手动设置该布尔值。抱歉,我找不到更好的答案。 -
关于弃用程序化挂起/恢复的一些相关讨论在这里:docs.oracle.com/javase/8/docs/technotes/guides/concurrency/…
-
Eclipse 有一个称为条件断点的功能,其中一些任意 java 代码在到达断点时和挂起当前线程之前被评估。所以你可以在那里执行一些额外挂起其他线程的代码。不知道 IntelliJ 有没有类似的功能。
-
也许这是不可能的。我假设 JVM 在所有支持它的平台上都使用 pthread。如果是这样,请参阅:stackoverflow.com/a/9408451/257299
-
@vikingsteve:这是一个很好的解决方法。我建议你添加一个单独的答案。
标签: java debugging intellij-idea jvm