6
votes

Java Debugger: Est-il possible de suspendre sélectivement des threads?

Dans ma vie passée en tant que programmeur C / C ++, il était possible sur certaines plateformes et combinaisons de débogage pour suspendre sélectivement les threads. Après avoir frappé un point d'arrêt, on pourrait émettre des commandes (ou cliquer sur des trucs dans l'interface graphique) à la glace / de la glace (suspension / sillage) un fil. Sur les commandes d'étape / suivantes / suivantes / Poursuite / Continuer, les threads suspendus n'exécuteraient aucune instruction.

est-ce possible avec n'importe quel IDE JVM ou Java aujourd'hui? J'utilise Intellij et je ne vois pas la fonctionnalité, je ne peux pas trouver d'informations via Google.

Pour clarifier:

  1. Je ne demande pas la stratégie de thread pour un point d'arrêt, par exemple, suspendre le fil de courant ou tous les filets. Je suis conscient de cette fonctionnalité de débogueur JVM.
  2. L'environnement de développement est Vanilla: J'utilise Intellij Java Ide et j'ai accès au code source en question.

    Enfin, je réalise que le "Java Debugger" est un terme un peu vague. AFAIK, Sun a publié un format débogué sur le fil que les débuggeurs utilisent pour communiquer avec la JVM. Peut-être que chaque JVM (IBM vs Sun Vs Ifedtea vs ???) prend en charge différentes capacités de débogage, mais je ne connais que le Sun / Oracle JVM.


5 commentaires

HI Kevin, avez-vous un contrôle sur le code que vous exécutez et est-ce juste un point spécifique? Étant donné que si vous êtes prêt à modifier le code, vous pouvez utiliser un Boolean ThreadSusSompouveaux et si (! Threadsuspendé) Motif et définissez la valeur booléenne manuellement dans le débogueur. Désolé de ne pas voir une meilleure réponse.


Une discussion pertinente sur l'amortissement de la suspension / CV programmatique est ici: docs.oracle.com/javase/8/docs/technotes/guides/concurrency/...


Eclipse a une fonctionnalité appelée points d'arrêt conditionnels où un code Java arbitraire est évalué pour frapper le point d'arrêt et avant de suspendre le fil actuel. Vous pouvez donc exécuter du code là-bas qui suspend également d'autres threads. Je ne sais pas si Intellij a une fonctionnalité comparable.


Peut-être que ce n'est pas possible. Je suppose que JVM utilise Pthreads sur toutes les plateformes qui le soutiennent. Si oui, voir: Stackoverflow.com/a/9408451/257299


@VikingSteve: C'est une bonne solution. Je vous suggère d'ajouter une réponse distincte.


4 Réponses :


1
votes

Eclipse peut le faire au moins avec l'Oracle VM mais je suppose que c'est possible avec chacun d'eux. Essayez de sélectionner un fil dans le débogueur (il doit y avoir une vue avec tous les threads en cours d'exécution). Ensuite, le bouton de suspension ne doit suspendre que ce fil au lieu de tous.


0 commentaires

3
votes

Vous pouvez certainement suspendre un seul fil dans JDB (voir ci-dessous). J'aime Intellij comme éditeur Java. De l'autre côté, son débogueur n'est pas terrible, mais proche.

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]


2 commentaires

Ma tête presque vient d'exploser. Informations exceptionnelles! La clé de cette réponse: il prouve le protocole de fil de débogage JVM prend en charge cette fonctionnalité. Maintenant, pour déposer une demande avec Jetbrains ...


Lecteurs: Veuillez ulployer la demande de fonctionnalité Intellij ici: Youtrack.JetBrains.com/issue/idea-79921 < / a>




1
votes

Avez-vous un contrôle sur le code que vous exécutez et est-ce juste un point spécifique?

Étant donné que si vous êtes prêt à modifier le code, vous pouvez utiliser un threadsususpendé et si (! threadsuspendé) motif et définissez la valeur booléenne manuellement dans le débogueur.

C'est une solution de contournement pratique - pas complètement la fonctionnalité que vous êtes après, mais cela pourrait faire le travail;)


0 commentaires