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

kev*_*rpe 5 java debugging jvm intellij-idea

在我过去作为C / C ++程序员的生活中,可能在某些平台和调试器组合上有选择地挂起线程。达到断点后,可以发出命令(或单击GUI中的内容)以对线程进行冰/除冰(挂起/唤醒)。在执行进一步的步骤/下一个/运行/继续命令时,挂起的线程将不执行任何指令。

今天,使用任何JVM或Java IDE都可以做到吗?我使用IntelliJ,但没有看到该功能,也无法通过Google找到任何信息。

澄清:

  1. 我不是在询问断点的线程策略,例如,暂停当前线程或所有线程。我知道该JVM调试器功能。
  2. 开发环境很普通:我使用IntelliJ Java IDE,并且可以访问有问题的源代码。

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

jdb*_*jdb 3

您绝对可以在 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]
Run Code Online (Sandbox Code Playgroud)