Java调试器:是否可以选择性地挂起线程? [英] Java Debugger: Is it possible selectively suspend threads?

查看:615
本文介绍了Java调试器:是否可以选择性地挂起线程?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在过去的一段时间里,作为一个C / C ++程序员,有可能在某些平台上调试器组合以选择性地挂起线程。击中断点之后,可以发出命令(或者在GUI中点击东西)来冰/除冰(挂起/唤醒)线程。在进一步的step / next / run / continue命令后,挂起的线程将不会执行任何指令。



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



澄清:


  1. 我不是询问断点的线程策略,例如挂起当前线程或所有线程。我知道这个JVM调试器功能。

  2. 开发环境是香草:我使用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:

  1. 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.
  2. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆