2011-09-29 42 views
35

Estoy usando Eclipse para depurar una aplicación Java. En algún lugar en el código consigo una excepción y el seguimiento de pila:¿Cómo mostrar la traza de pila completa en eclipse?

Caused by: java.io.EOFException: The connection has been reset while reading the header 
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.fetchHeader(Message.java:583) 
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.readHeaderAndPayload(Message.java:599) 
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.read(Message.java:542) 
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.recv(Message.java:1029) 
    at com.gemstone.gemfire.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:158) 
    at com.gemstone.gemfire.cache.client.internal.AbstractOp.attempt(AbstractOp.java:363) 
    at com.gemstone.gemfire.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:229) 
    at com.gemstone.gemfire.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:321) 
    at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:646) 
    at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:108) 
    ... 11 more 

¿Cómo consigo toda la pila en lugar del ... 11 more?

+2

La ventana de la consola Eclipse debe mostrar la excepción completa. ¿Dónde está esta traza de impresión? He visto trazas limitadas como esta en el navegador cuando se trata de una aplicación web, pero nunca un rastro limitado en la consola. – cdeszaq

+0

No lo sé, eso es lo que intento averiguar. La cuestión es que mis puntos de interrupción no están activados, por lo que no puedo averiguar exactamente dónde. –

+0

¿Qué quieres decir? Todo lo que estoy preguntando es "¿dónde estás viendo esto? ¿Está en una parte de la interfaz IDE de Eclipse (específicamente la consola) o se muestra en alguna otra ventana o archivo? – cdeszaq

Respuesta

28

Usted tiene toda la pila.

Esto es solo parte de un seguimiento de pila. Directamente antes de esto, era otra pieza. Mire las líneas inferiores de esta, y las líneas superiores de la anterior. Los verás coincidir. El seguimiento de la pila comenzó con una sección que no comienza con "Causado por".

La excepción "Causado por" está ocultando partes del rastreo de pila que son copias literales de las entradas de rastreo de pila en su elemento principal. En otras palabras, Java no muestra toda la pila hasta main() para cada causa, solo muestra lo que no has visto. Vea el Throwable.printStackTrace() documentation.

"Causado por" se llena cuando proporciona una causa al crear un Throwable. Mira los constructores para eso. Esto se hace cuando un fragmento de código capta una excepción de bajo nivel y luego quiere volver a plantearlo como una clase de excepción diferente.

+4

No entiendo completamente ... –

+3

@Luchian - Esto es solo _parte_ de un seguimiento de la pila. Directamente antes de esto, era otra pieza. Mire las líneas inferiores de esta, y las líneas superiores de la anterior. Los verás coincidir. El seguimiento de la pila _began_ con una sección que no comienza con "Causado por". –

+1

Bien ... bien, entonces creo que estoy atascado. Quería atrapar la excepción antes. La cosa es que, establecí un punto de interrupción donde aparentemente se lanza la excepción, pero no se desencadena ... –

1

Como dice Ed, muestra toda la pila, pero omite la información que ya ha visto. Ver Throwable#printStackTrace()

Citando a partir de ahí:

nota la presencia de líneas que contienen los caracteres "...". Estas líneas indican que el resto del seguimiento de pila para esta excepción coincide con el número indicado de marcos de la parte inferior de el seguimiento de pila de la excepción provocada por esta excepción (la excepción "adjuntando"). Esta taquigrafía puede reducir en gran medida la longitud de la salida en el caso común donde una excepción envuelto es lanzada desde mismo método que el "excepción causal" está atrapado

A menudo se envuelve una excepción; creada con otra excepción como la causa:

try { 
    // something which causes an Exception 
} catch (Exception e) { 
    throw new SpecificException("help", e); 
} 

En este caso, mostrando el StackTrace creará la ... 11 más que se ve.

1

nunca he visto eso, sino que probar este

public void problemFunction(){ 
    try{ 
     //your code 
    catch(Exception ex){ 
    ex.printStackTrace(); 
    } 
} 

o

public void problemFunction(){ 
    try{ 
     //your code 
    } 
    catch(Exception ex){ 
    System.out.println(ex); 
    StackTraceElement[] arr = ex.getStackTrace(); 
    for(int i=0; i<arr.length; i++){ 
     System.out.println(arr[i].toString()); 
    } 
    } 
} 
2

Creo que significa que el Exception fue capturado y se empaqueta en otros veces antes printStackTrace se llamaba.

tratar de averiguar la salida del siguiente programa para su mejor comprensión:

public class PrintStackTrace { 

    public static void main(String[] args) { 
     try { 
      level1(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     try { 
      level2(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


    static void level2() throws Exception { 
     try { 
      level1(); 
     } catch (Exception e) { 
      throw new Exception(e); 
     } 
    } 

    static void level1() throws Exception { 
     try { 
      throwingMethod(); 
     } catch (Exception e) { 
      throw new Exception(e); 
     } 
    } 

    static void throwingMethod() throws Exception { 
     throw new Exception("throwingMethod"); 
    } 

} 
9

las respuestas anteriores no son exactos, cada vez que la pila muestran las palabras "causadas por" significa que la excepción fue a través uno o varios métodos hasta que fue capturado, y luego arrojado nuevamente. Esto podría suceder muchas muchas veces, la traza de pila no es un bucle, es una dirección única, entonces no, las cosas en la parte superior no se relacionan con las cosas en la parte inferior, la parte más importante ES en la parte inferior, que es la raíz de la excepción, por lo que si usted tiene:

excepción en clase principal: bla, bla, bla ... líneas de código ... causadas por FileNotFoundException ... líneas de código ... causados ​​por: MalformedURLException ... líneas de código ... causados ​​por: NullPointerException

entonces no tendrían que centrarse tanto en la FileNotFoundException, pero que tendrían que centrarse más sobre la NullPointerException. Como decir que tienes un archivo de propiedades con un nombre de archivo. Si se usa accidentalmente mykey, para encontrar la propiedad "myKey", entonces propertiesResource devolverá un valor nulo, que luego se lanzará a través de todas las líneas de código (con suerte) a su aplicación donde está el último bloque catch. . . que, en este momento, sería "envuelto" no como una excepción nula, sino como una excepción FileNotFoundException. . .

5

enter image description here

Podríamos estar divergentes del problema real que está enfrentando. Estaba teniendo un problema similar y resultó que tenía marcada mi casilla Limit console out put box. Después de eliminarlo, pude ver el seguimiento completo de la pila. Pasos: Haga clic derecho en la consola || ctrl + clic en mac si ir a las preferencias y siga las instrucciones anteriores

+0

No puedo decir cuánto estamos divergiendo, han pasado 4 años :) Ya no enfrenta ese problema ... –

+0

Haha. En realidad estaba enfrentando este problema.Así que ponlo ahí para que alguien más no se distraiga cuando no está viendo la traza completa de pila en eclipse. Cuatro años en mucho tiempo. – shashwatZing

0

Hay una opción de vmargs

-XX:-OmitStackTraceInFastThrow 

lo que podría ayudar en algunas situaciones.

Cuestiones relacionadas