ideas - intellij debug java
IntelliJ Thread Debug (5)
Tienes una bonita vista de Threads
disponible.
Presione la pequeña rueda dentada y verá todos los hilos activos.
Y en cada punto de interrupción puede configurar la política de suspensión. Puede hacer que la alternativa de Thread
la predeterminada para todos los puntos de interrupción o puede establecerlos individualmente en cada punto de interrupción.
¿IntelliJ IDEA proporciona depuración de subprocesos? Es decir, Netbeans le permite depurar varios subprocesos y detenerse en esos puntos de interrupción (automáticamente). Sin embargo, todo lo que parece obtener en IntelliJ es "dumping de hilo", que parece ser un análisis que es manual, y una instantánea tomada cuando hice clic en ''Volcado de subprocesos''.
¿Se me escapa algo? He buscado en Google y no encontré información suficiente para ayudar.
Yo creo que puedes. He suspendido los hilos a través de puntos de interrupción configurando la política de suspensión . Esto suspenderá el hilo que está ejecutando este fragmento de código. Si tienes múltiples hilos, entonces creo que seguirían.
Para citar la política de suspensión
- Descripción del Artículo
- Todo: cuando se llega al punto de interrupción, todos los hilos están suspendidos
- Subproceso: cuando se golpea el punto de interrupción, se suspende el subproceso donde se golpea el punto de interrupción.
- Ninguno: ningún hilo está suspendido.
Para mí, el problema de no acceder al hilo todavía ocurre. Configuré puntos de frenado a todos. Y ponga los puntos de freno dentro de los métodos de llamada. Lo que noté es que se accede al método en el nuevo subproceso cuando llamo a run () pero no start (). Me pregunto por qué, el método AFAIK the start () debería llamar a run (). Sin embargo, la salida del hilo ocurre incluso cuando llamo a .start (), pero nunca accedo a él.
Creo que el problema que tienes es que los hilos secundarios se cierran antes de lo esperado porque el hilo principal ( la prueba en sí ) llega hasta el final.
Recuerda que cuando realizas un Thread.start () se inicia una llamada asíncrona, entonces si estás ejecutando tus pruebas usando Junit, la ejecución continuará después de esta llamada hasta el final de la prueba, y tan pronto como llegue al final, apaga los hilos que comenzó dentro de él.
Por lo tanto, si tiene algo como:
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. }
Ejecutará el Assert antes de que el código dentro de la ejecución () conduzca a una prueba de falla.
Pero si agrega un sueño simple, puede detener el hilo principal y depurar y hacer lo que necesita antes de que se detenga el hilo principal.
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. }
Seguramente hay mejores formas de hacerlo, pero el Thread.sleep puede ser lo que estás buscando.
Espero que pueda ayudar a alguien!
Para mí, el problema era que parece haber una condición de carrera con la reanudación de los hilos después de los puntos de interrupción y la evaluación de puntos de corte en IntelliJ.
Mi trabajo a corto plazo fue no establecer puntos de interrupción justo antes de generar un hilo. Si no hago esto, los primeros puntos de ruptura en el run () o call () se pierden.