Como posso aumentar o número de linhas exibidas de um despejo de rastreamento de pilha Java?

Respostas:

122

Você não precisa; essa informação está presente em outro lugar no rastreamento da pilha. Dos documentos de printStackTrace():

Observe a presença de linhas contendo os caracteres "..." . Essas linhas indicam que o restante do rastreamento de pilha para esta exceção corresponde ao número indicado de quadros da parte inferior do rastreamento de pilha da exceção que foi causada por esta exceção (a exceção "delimitadora").

Essa abreviação pode reduzir muito o comprimento da saída no caso comum em que uma exceção encapsulada é lançada a partir do mesmo método em que a "exceção causativa" é capturada.

Em outras palavras, o "... x more"aparece apenas em uma exceção encadeada e apenas quando as últimas xlinhas do rastreamento de pilha já estão presentes como parte do rastreamento de pilha de outra exceção encadeada.

Suponha que um método capture a exceção Foo, envolva-a na exceção Bar e lance Bar. Em seguida, o rastreamento de pilha de Foo será reduzido. Se você, por algum motivo, quiser o rastreamento completo, tudo o que você precisa fazer é pegar a última linha antes do ...rastreamento de pilha de Foo e procurá-la no rastreamento de pilha da Barra; tudo abaixo dessa linha é exatamente o que seria impresso no rastreamento de pilha de Foo.

Michael Myers
fonte
O último parágrafo é enganoso. Não haverá qualquer sobreposição, a linha anterior ...é o primeiro quadro que difere. No entanto, será pelo menos na mesma classe que ajuda a encontrá-lo.
Marcono1234
5

Adivinhação rápida de um método para você.

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

Vamos pegar o rastreamento de pilha da documentação 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

As causas são exibidas a partir da mais aninhada na parte inferior (a "causa raiz"), até aquela à qual o rastreamento de pilha impresso pertence.

Neste caso, a causa raiz é o LowLevelExceptionque causou MidLevelException, o que causouHighLevelException .

Para obter o rastreamento de pilha completo, você deve olhar os frames da exceção delimitadora (e suas exceções delimitadoras):

  1. Veja quantos frames foram omitidos: "... X mais"
  2. Procure os frames omitidos na exceção envolvente
    1. Veja quantos frames foram omitidos: "... Y mais"
    2. Acrescente os primeiros quadros X - Y ao rastreamento de pilha
  3. Se Y> 0, repita a etapa 2 com ele como o número de quadros omitidos

Portanto, se quiséssemos obter o rastreamento de pilha completo de LowLevelException, faríamos o seguinte:

  1. Veja quantos frames foram omitidos: "... mais 3 "
  2. Procure os frames omitidos na exceção delimitadora ( MidLevelException)
    1. 1 quadro foi omitido ("... mais 1 ")
    2. Acrescente os primeiros 2 (3 - 1) quadros ao rastreamento de pilha
  3. Repita a etapa 2 com 1 como número de quadros omitidos
    1. Observe a exceção delimitadora de MidLevelException( HighLevelException)
    2. Acrescenta o primeiro 1 quadro ao rastreamento de pilha

Seu rastreamento de pilha completo terá a seguinte aparência:

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 laterais:

  • Pode haver casos em que nenhum quadro é listado, por exemplo:

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

    Isso pode acontecer quando a causa que criou na mesma linha: new HighLevelException(new MidLevelException()). Não se confunda com isso, a abordagem descrita acima ainda funciona, simplesmente não há frames para usar a partir da exceção, continue com o que está incluído.

  • Em alguns casos, você pode evitar a contagem olhando para o primeiro quadro que não foi omitido (a linha acima ... X more). Se você souber quais métodos chamam o método nessa linha, você pode pesquisar diretamente os chamadores nos frames da exceção envolvente:

    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
fonte