¿Cómo puedo aumentar el número de líneas mostradas de un volcado de seguimiento de pila de Java?

Respuestas:

122

No es necesario; esa información está presente en otra parte del seguimiento de la pila. De los documentos de printStackTrace():

Tenga en cuenta la presencia de líneas que contienen los caracteres "...". Estas líneas indican que el resto del seguimiento de la pila para esta excepción coincide con el número indicado de tramas desde la parte inferior del seguimiento de la pila de la excepción que fue causada por esta excepción (la excepción "adjunta").

Esta abreviatura puede reducir en gran medida la longitud de la salida en el caso común en el que se lanza una excepción ajustada desde el mismo método que se detecta la "excepción causal".

En otras palabras, el "... x more"único aparece en una excepción encadenada, y solo cuando las últimas xlíneas del seguimiento de la pila ya están presentes como parte del seguimiento de la pila de otra excepción encadenada.

Supongamos que un método detecta la excepción Foo, la envuelve en la excepción Bar y lanza Bar. Entonces se acortará el seguimiento de la pila de Foo. Si por alguna razón desea el rastreo completo, todo lo que necesita hacer es tomar la última línea antes del ...rastreo de pila de Foo y buscarlo en el rastreo de pila de Bar; todo lo que está debajo de esa línea es exactamente lo que se habría impreso en el seguimiento de pila de Foo.

Michael Myers
fuente
El último párrafo es engañoso. No habrá ninguna superposición, la línea anterior ...es el primer cuadro que difiere. Sin embargo, al menos estará en la misma clase, lo que ayuda a encontrarlo.
Marcono1234
5

Adivina rápidamente un método para ti.

static void printLongerTrace(Throwable t){
    for(StackTraceElement e: t.getStackTrace())
        System.out.println(e);
}
jjnguy
fuente
2

Tomemos el seguimiento de la pila de la documentación de Throwable.printStackTrace () :

HighLevelException: MidLevelException: LowLevelException
    at Junk.a(Junk.java:13)
    at Junk.main(Junk.java:4)
Caused by: MidLevelException: LowLevelException
    at Junk.c(Junk.java:23)
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    ... 1 more
Caused by: LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    ... 3 more

Las causas se muestran desde la más anidada en la parte inferior (la "causa raíz") hasta la que pertenece el seguimiento de la pila impresa.

En este caso, la causa raíz es LowLevelException, qué causó MidLevelException, qué causó HighLevelException.

Para obtener el seguimiento de pila completo, debe mirar los marcos de la excepción adjunta (y sus excepciones adjuntas):

  1. Mira cuántos fotogramas se omitieron: "... X más"
  2. Busque los marcos omitidos en la excepción adjunta
    1. Mira cuántos fotogramas se omitieron: "... Y más"
    2. Agregue los primeros marcos X - Y al seguimiento de la pila
  3. Si Y> 0, repita el paso 2 con él como número de fotogramas omitidos

Entonces, si quisiéramos obtener el seguimiento completo de la pila LowLevelException, haríamos lo siguiente:

  1. Mira cuántos fotogramas se omitieron: "... 3 más"
  2. Busque los marcos omitidos en la excepción adjunta ( MidLevelException)
    1. Se ha omitido 1 fotograma ("... 1 más")
    2. Agregue los primeros 2 (3 - 1) marcos al seguimiento de la pila
  3. Repita el paso 2 con 1 como número de fotogramas omitidos
    1. Mira la excepción adjunta de MidLevelException( HighLevelException)
    2. Anexar el primer fotograma al seguimiento de la pila

Su seguimiento de pila completo se ve así:

LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    // From MidLevelException stack trace
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    // From HighLevelException stack trace
    at Junk.main(Junk.java:4)

Notas al margen:

  • Puede haber casos en los que no se enumeran marcos, por ejemplo:

    HighLevelException: MidLevelException
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        ... 1 more

    Esto puede ocurrir cuando la causa que crea en la misma línea: new HighLevelException(new MidLevelException()). No se confunda con esto, el enfoque descrito anteriormente todavía funciona, simplemente no hay marcos para usar de la excepción, continúe con el que lo incluye.

  • En algunos casos, puede ahorrarse el conteo mirando el primer cuadro que no se omitió (la línea de arriba ... X more). Si sabe qué métodos llaman al método en esa línea, puede buscar directamente las personas que llaman en los marcos de la excepción adjunta:

    HighLevelException: MidLevelException: LowLevelException
        at Junk.c(Junk.java:29)
        at Junk.b(Junk.java:21)
        at Junk.a(Junk.java:13)
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        // You know Junk.d is only called by Junk.b
        at Junk.d(Junk.java:35)
        ... 3 more
Marcono1234
fuente