web-dev-qa-db-fra.com

Débogage de threads IntelliJ

Est-ce que IntelliJ IDEA fournit un débogage de threads? C’est-à-dire que Netbeans vous permet de déboguer plusieurs threads et d’arrêter (automatiquement) à ces points de rupture. Cependant, tout ce que je semble obtenir dans IntelliJ est un "thread dumping", qui semble être une analyse manuelle et un instantané pris lorsque j'ai cliqué sur "Thread Dump".

Y a-t-il quelque chose qui me manque? J'ai consulté Google et n'ai pas trouvé suffisamment d'informations pour vous aider.

17
Dane Balia

Je pense que tu peux. J'ai suspendu des threads via des points d'arrêt en définissant la règle suspend policy . Cela va suspendre le thread qui exécute ce morceau de code. Si vous avez plusieurs fils, je penserais qu'ils continueraient.

Pour citer la politique de suspension

  • Description de l'article 
  • Tous: lorsque le point d'arrêt est atteint, tous les threads sont suspendus
  • Fil: Lorsque le point d'arrêt est atteint, le fil de discussion où il est touché est suspendu. 
  • Aucun: aucun fil n'est suspendu.
25
RNJ

Vous avez une belle vue Threads disponible.

Appuyez sur la petite roue dentée et vous verrez tous les filets actifs.

enter image description here

Et sur chaque point d'arrêt, vous pouvez définir la stratégie de suspension. Vous pouvez définir l'option Thread comme valeur par défaut pour tous les points d'arrêt ou vous pouvez les définir individuellement pour chaque point d'arrêt. 

enter image description here

7
maba

Pour moi, le problème de ne pas accéder au fil est toujours présent. J'ai mis des points d'arrêt à tous. Et mettez des points de freinage dans les méthodes d'appel. Ce que j'ai remarqué, c'est que la méthode dans le nouveau thread est accessible lorsque j'appelle run () mais pas start (). Je me demandais simplement pourquoi, autant que je sache, la méthode start () devrait appeler run (). Néanmoins, la sortie du thread se produit même si j'appelle .start (), mais n'y accède jamais.

3
Jacob

Je pense que le problème que vous avez est que les threads enfants sont fermés plus tôt que prévu car le thread principal ( le test lui-même ) va jusqu'au bout.

Rappelez-vous que lorsque vous effectuez un Thread.start (), un appel asynchrone commence, puis si vous exécutez vos tests avec Junit, l'exécution se poursuivra après cet appel jusqu'à la fin du test, et dès qu'il atteindra la fin, il ferme les threads que vous avez commencé à l'intérieur.

Par conséquent, si vous avez quelque chose comme:

01. import org.junit.Assert;
02. import org.junit.Test;
03. public class ThreadTest {
04.     static boolean didIGetIt = false;
05.     @Test
06.     public void testThread() {
07.         Thread myThread = new Thread(new Runnable() {
08.             @Override
09.             public void run() {
10.                 System.out.println("I am an asynchronous task");
11.                 System.out.println("and JUnit won't wait for me to finish my job!");
12.                 didIGetIt = true;
13.             }
14.         });
15.         myThread.start();
16.         Assert.assertTrue(didIGetIt);
17.     }
18. }

Il exécutera l'assertion avant le code à l'intérieur de la course () conduisant à un test d'échec.

Mais si vous ajoutez un simple sommeil, vous pouvez arrêter le thread principal et le débogage et faire ce dont vous avez besoin avant que le thread principal ne s’arrête.

01. import org.junit.Assert;
02. import org.junit.Test;
03. public class ThreadTest {
04.     static boolean didIGetIt = false;
05.     @Test
06.     public void testThread() throws InterruptedException {
07.         Thread myThread = new Thread(new Runnable() {
08.             @Override
09.             public void run() {
10.                 System.out.println("I am an asynchronous task");
11.                 System.out.println("and JUnit won't wait for me to finish my job!");
12.                 didIGetIt = true;
13.             }
14.         });
15.         myThread.start();
16.         System.out.println("Let's wait for child threads to finish");
17.         Thread.sleep(5000);
18.         Assert.assertTrue(didIGetIt);
19.     }
20. }

Il existe sûrement de meilleures façons de le faire, mais le Thread.sleep est peut-être ce que vous recherchez.

J'espère que ça peut aider quelqu'un!

0
Marco Vargas

Pour moi, le problème était qu’il semblait y avoir une situation de concurrence critique en raison de la reprise des threads après les points de rupture et de l’évaluation des points de rupture dans IntelliJ.

Mon travail à court terme consistait à ne pas définir de points d'arrêt juste avant de générer un thread. Si je ne le fais pas, les quelques premiers points d'arrêt du run () ou call () sont manquants.

0
kervin