Come si aumenta il numero di righe visualizzate di un dump di traccia dello stack Java?


Risposte:


122

Non è necessario; quell'informazione è presente altrove nell'analisi dello stack. Dai documenti di printStackTrace():

Notare la presenza di righe contenenti i caratteri "...". Queste righe indicano che il resto dell'analisi dello stack per questa eccezione corrisponde al numero di frame indicato dalla fine dell'analisi dello stack dell'eccezione causata da questa eccezione (l'eccezione "di chiusura").

Questa scorciatoia può ridurre notevolmente la lunghezza dell'output nel caso comune in cui viene generata un'eccezione racchiusa dallo stesso metodo in cui viene rilevata l '"eccezione causale".

In altre parole, "... x more"appare solo su un'eccezione concatenata e solo quando le ultime xrighe dell'analisi dello stack sono già presenti come parte dell'analisi dello stack di un'altra eccezione concatenata.

Supponiamo che un metodo catturi l'eccezione Foo, la racchiuda in un'eccezione Bar e lanci Bar. Quindi la traccia dello stack di Foo verrà ridotta. Se per qualche motivo vuoi la traccia completa, tutto ciò che devi fare è prendere l'ultima riga prima della ...traccia dello stack di Foo e cercarla nella traccia dello stack del Bar; tutto al di sotto di quella linea è esattamente ciò che sarebbe stato stampato nella traccia dello stack di Foo.


L'ultimo paragrafo è fuorviante. Non ci saranno sovrapposizioni, la linea prima ...è il primo fotogramma che differisce. Tuttavia sarà almeno nella stessa classe che aiuta a trovarlo.
Marcono1234

5

Indovina rapidamente un metodo per te.

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

2

Prendiamo la traccia dello stack dalla documentazione di 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

Le cause vengono visualizzate da quella più annidata in basso (la "causa principale"), a quella a cui appartiene la traccia dello stack stampata.

In questo caso la causa principale è LowLevelException, che ha causato MidLevelException, che ha causato HighLevelException.

Per ottenere la traccia dello stack completa devi guardare i frame dell'eccezione che lo racchiude (e le sue eccezioni che lo racchiudono):

  1. Guarda quanti frame sono stati omessi: "... X more"
  2. Cerca i frame omessi nell'eccezione che lo racchiude
    1. Guarda quanti frame sono stati omessi: "... Y more"
    2. Aggiungi i primi frame X - Y alla traccia dello stack
  3. Se Y> 0, ripetere il passaggio 2 indicandolo come numero di fotogrammi omessi

Quindi, se volessimo ottenere la traccia completa dello stack, LowLevelExceptiondovremmo fare quanto segue:

  1. Guarda quanti frame sono stati omessi: "... altri 3 "
  2. Cerca i frame omessi nell'eccezione che lo racchiude ( MidLevelException)
    1. 1 frame è stato omesso ("... 1 altro")
    2. Aggiungi i primi 2 (3 - 1) fotogrammi alla traccia dello stack
  3. Ripetere il passaggio 2 con 1 come numero di fotogrammi omessi
    1. Guarda l'eccezione allegata di MidLevelException( HighLevelException)
    2. Aggiungi il primo fotogramma 1 alla traccia dello stack

La tua traccia dello stack completa sarà quindi simile a questa:

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)

Note a margine:

  • Potrebbero verificarsi casi in cui non è elencato alcun frame, ad esempio:

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

    Questo può accadere quando la causa ha creato nella stessa linea: new HighLevelException(new MidLevelException()). Non lasciarti confondere da questo, l'approccio descritto sopra funziona ancora, non ci sono solo frame da usare dall'eccezione, continua con quello che lo racchiude.

  • In alcuni casi puoi salvarti il ​​conteggio guardando il primo fotogramma che non è stato omesso (la riga sopra ... X more). Se sai quali metodi chiamano il metodo in quella riga, puoi cercare direttamente i chiamanti nei frame dell'eccezione che lo racchiude:

    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
    
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.