Java调试器:是否可以选择性地挂起线程? [英] Java Debugger: Is it possible selectively suspend threads?
问题描述
今天可以使用任何JVM或Java IDE吗?我使用IntelliJ,我没有看到该功能,也没有通过Google找到任何信息。
澄清:
- 我不是询问断点的线程策略,例如挂起当前线程或所有线程。我知道这个JVM调试器功能。
- 开发环境是香草:我使用IntelliJ Java IDE,我可以访问有问题的源代码。
最后,我意识到Java调试器是一个有点模糊的术语。 AFAIK,Sun发布了调试器用于与JVM通信的线上调试格式。也许每个JVM(IBM vs Sun vs IcedTea vs ???)都支持不同的调试功能,但我只熟悉Sun / Oracle JVM。
你可以在jdb中挂起一个线程(见下文)。我喜欢IntelliJ作为Java编辑器。另一方面,它的调试器并不可怕,但关闭。
初始化jdb ...
>运行
没有任何挂起。
>线程
组系统:
(java.lang.ref.Reference $ ReferenceHandler)0x141参考处理程序cond。等待
(java.lang.ref.Finalizer $ FinalizerThread)0x140 Finalizer cond。等待
(java.lang.Thread)0x13f信号调度程序运行
(java.lang.Thread)0x401 Java2D Disposer cond。等待
(java.lang.Thread)0x804 TimerQueue cond。等待
组主要:
(java.lang.Thread)0x322 AWT-AppKit运行
(java.lang.Thread)0x323 AWT-Shutdown cond。等待
(java.awt.EventDispatchThread)0x5ec AWT-EventQueue-0 cond。等待
(java.util.TimerThread)0x750 Timer-0 cond。等待
(java.lang.Thread)0x7fd DestroyJavaVM运行
>暂停0x5ec
>线程
组系统:
(java.lang.ref.Reference $ ReferenceHandler)0x141参考处理程序cond。等待
(java.lang.ref.Finalizer $ FinalizerThread)0x140 Finalizer cond。等待
(java.lang.Thread)0x13f信号调度程序运行
(java.lang.Thread)0x401 Java2D Disposer cond。等待
(java.lang.Thread)0x804 TimerQueue cond。等待
组主要:
(java.lang.Thread)0x322 AWT-AppKit运行
(java.lang.Thread)0x323 AWT-Shutdown cond。等待
(java.awt.EventDispatchThread)0x5ec AWT-EventQueue-0在监视器中等待
(java.util.TimerThread)0x750 Timer-0 cond。等待
(java.lang.Thread)0x7fd DestroyJavaVM运行
>其中0x5ec
[1] java.lang.Object.wait(本机方法)
[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]其中0x322
当前线程不被挂起。
AWT-AppKit [1] resume 0x5ec
AWT-AppKit [1]其中0x5ec
当前线程未挂起。
AWT-EventQueue-0 [1]
In my past life as a C/C++ programmer, it was possible on some platforms & debugger combinations to selectively suspend threads. After hitting a breakpoint, one could issue commands (or click stuff in the GUI) to ice/de-ice (suspend / wake) a thread. Upon further step/next/run/continue commands, suspended threads would not execute any instructions.
Is this possible with any JVM or Java IDE today? I use IntelliJ and I don't see the feature, nor can I find any information via Google.
To clarify:
- I am not asking about the thread policy for a breakpoint, e.g, suspend current thread or all threads. I am aware of that JVM debugger feature.
- The dev environment is vanilla: I use IntelliJ Java IDE, and I have access to the source code in question.
Finally, I realise the "Java debugger" is a somewhat vague term. AFAIK, Sun published a debug-on-the-wire format that debuggers use to communicate with the JVM. Perhaps each JVM (IBM vs Sun vs IcedTea vs ???) supports different debug capabilities, but I am only familiar with the Sun/Oracle JVM.
You can definitely suspend a single thread in jdb (see below). I love IntelliJ as a Java editor. On the other side its debugger is not terrible, but close.
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]
这篇关于Java调试器:是否可以选择性地挂起线程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!