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. P>
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. P>
Pour clarifier: P>
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. P>
4 Réponses :
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. P>
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]
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>
Intellij Idea l'a maintenant (je regarde V15). La fenêtre de débogage a un panneau de threads, qui permet de suspendre et de reprendre n'importe quel thread. P>
https://www.jetbrises.com/idea /Help/debug-tool-window-threads.html p>
Avez-vous un contrôle sur le code que vous exécutez et est-ce juste un point spécifique? p>
Étant donné que si vous êtes prêt à modifier le code, vous pouvez utiliser un C'est une solution de contournement pratique - pas complètement la fonctionnalité que vous êtes après, mais cela pourrait faire le travail;) p> threadsususpendé code> et
si (! threadsuspendé) code> motif et définissez la valeur booléenne manuellement dans le débogueur. p>
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 Code> et
si (! Threadsuspendé) Code> 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.