Java调试器:是否可以选择性地挂起线程?

在我过去作为C / C ++程序员的生活中,在某些平台和调试器组合上有可能选择性地挂起线程。 在点击断点之后,可以发出命令(或点击GUI中的内容)来冻结/解冻(暂停/唤醒)线程。 在进一步的step / next / run / continue命令时,挂起的线程不会执行任何指令。

今天可以使用任何JVM或Java IDE吗? 我使用IntelliJ而我看不到该function,也无法通过Google找到任何信息。

澄清:

  1. 我不是在询问断点的线程策略,例如,挂起当前线程或所有线程。 我知道JVM调试器function。
  2. 开发环境是vanilla:我使用IntelliJ Java IDE,我可以访问相关的源代码。

最后,我意识到“Java调试器”是一个有点模糊的术语。 AFAIK,Sun发布了一种调试线程格式,调试器使用该格式与JVM进行通信。 也许每个JVM(IBM vs Sun vs IcedTea vs ???)支持不同的调试function,但我只熟悉Sun / Oracle JVM。

你绝对可以在jdb中挂起一个线程(见下文)。 我喜欢IntelliJ作为Java编辑器。 另一方面,它的调试器并不可怕,但很接近。

 Initializing jdb ... > run Nothing suspended. > threads Group system: (java.lang.ref.Reference$ReferenceHandler)0x141 Reference Handler cond. waiting (java.lang.ref.Finalizer$FinalizerThread)0x140 Finalizer cond. waiting (java.lang.Thread)0x13f Signal Dispatcher running (java.lang.Thread)0x401 Java2D Disposer cond. waiting (java.lang.Thread)0x804 TimerQueue cond. waiting Group main: (java.lang.Thread)0x322 AWT-AppKit running (java.lang.Thread)0x323 AWT-Shutdown cond. waiting (java.awt.EventDispatchThread)0x5ec AWT-EventQueue-0 cond. waiting (java.util.TimerThread)0x750 Timer-0 cond. waiting (java.lang.Thread)0x7fd DestroyJavaVM running > suspend 0x5ec > threads Group system: (java.lang.ref.Reference$ReferenceHandler)0x141 Reference Handler cond. waiting (java.lang.ref.Finalizer$FinalizerThread)0x140 Finalizer cond. waiting (java.lang.Thread)0x13f Signal Dispatcher running (java.lang.Thread)0x401 Java2D Disposer cond. waiting (java.lang.Thread)0x804 TimerQueue cond. waiting Group main: (java.lang.Thread)0x322 AWT-AppKit running (java.lang.Thread)0x323 AWT-Shutdown cond. waiting (java.awt.EventDispatchThread)0x5ec AWT-EventQueue-0 waiting in a monitor (java.util.TimerThread)0x750 Timer-0 cond. waiting (java.lang.Thread)0x7fd DestroyJavaVM running > where 0x5ec [1] java.lang.Object.wait (native method) [2] java.lang.Object.wait (Object.java:485) [3] java.awt.EventQueue.getNextEvent (EventQueue.java:558) [4] java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java:263) [5] java.awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread.java:211) [6] java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java:201) [7] java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:196) [8] java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:188) [9] java.awt.EventDispatchThread.run (EventDispatchThread.java:122) AWT-EventQueue-0[1] where 0x322 Current thread isn't suspended. AWT-AppKit[1] resume 0x5ec AWT-AppKit[1] where 0x5ec Current thread isn't suspended. AWT-EventQueue-0[1] 

Eclipse至少可以使用Oracle VM来实现,但我想所有这些都可以实现。 尝试在调试器中选择一个线程(应该有一个包含所有正在运行的线程的视图)。 然后暂停按钮应该只挂起该线程而不是所有线程。

IntelliJ IDEA现在有它(我正在看v15)。 Debug窗口有一个Threads面板,允许挂起和恢复任何线程。

https://www.jetbrains.com/idea/help/debug-tool-window-threads.html

Threads面板的屏幕截图

您是否可以控制正在运行的代码,它只是一个特定点吗?

因为如果你准备修改代码,你可以使用boolean threadSuspendedif (!threadSuspended)模式,并在调试器中手动设置该布尔值。

这是一个实用的解决方法 – 不完全是你所追求的function,但它可能会起作用;)