Comment augmenter le nombre de lignes affichées d'un vidage de trace de pile Java?

Réponses:

122

Vous n'en avez pas besoin; cette information est présente ailleurs dans la trace de pile. D'après la documentation de printStackTrace():

Notez la présence de lignes contenant les caractères "...". Ces lignes indiquent que le reste de la trace de pile pour cette exception correspond au nombre de trames indiqué à partir du bas de la trace de pile de l'exception qui a été provoquée par cette exception (l'exception «englobante»).

Ce raccourci peut réduire considérablement la longueur de la sortie dans le cas courant où une exception encapsulée est levée à partir de la même méthode que "l'exception causale" est interceptée.

En d'autres termes, le "... x more"n'apparaît que sur une exception chaînée, et uniquement lorsque les dernières xlignes de la trace de pile sont déjà présentes dans le cadre de la trace de pile d'une autre exception chaînée.

Supposons qu'une méthode intercepte l'exception Foo, l'encapsule dans l'exception Bar et lève Bar. Ensuite, la trace de pile de Foo sera raccourcie. Si, pour une raison quelconque, vous voulez la trace complète, tout ce que vous avez à faire est de prendre la dernière ligne avant la ...trace de pile de Foo et de la rechercher dans la trace de pile de la barre; tout ce qui se trouve en dessous de cette ligne est exactement ce qui aurait été imprimé dans la trace de pile de Foo.

Michael Myers
la source
Le dernier paragraphe est trompeur. Il n'y aura pas de chevauchement, la ligne avant ...est la première image qui diffère. Cependant, il sera au moins dans la même classe qui aide à le trouver.
Marcono1234
5

Devinez rapidement une méthode pour vous.

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

Prenons la trace de la pile de la documentation 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

Les causes sont affichées de la plus imbriquée en bas (la «cause racine») à celle à laquelle appartient la trace de pile imprimée.

Dans ce cas, la cause première est LowLevelException, qui a causé MidLevelException, qui a causé HighLevelException.

Pour obtenir la trace complète de la pile, vous devez regarder les cadres de l'exception englobante (et ses exceptions englobantes):

  1. Regardez combien de cadres ont été omis: "... X plus"
  2. Recherchez les cadres omis dans l'exception englobante
    1. Regardez combien de cadres ont été omis: "... Y de plus"
    2. Ajouter les premières trames X - Y à la trace de pile
  3. Si Y> 0, répétez l'étape 2 avec comme nombre d'images omises

Donc, si nous voulions obtenir la trace complète de la pile, LowLevelExceptionnous ferions ce qui suit:

  1. Regardez combien de cadres ont été omis: "... 3 de plus"
  2. Recherchez les cadres omis au niveau de l'exception ( MidLevelException)
    1. 1 cadre a été omis ("... 1 de plus")
    2. Ajouter les 2 premiers (3 - 1) cadres à la trace de pile
  3. Répétez l'étape 2 avec 1 comme nombre d'images omises
    1. Regardez l'exception englobante de MidLevelException( HighLevelException)
    2. Ajouter la première image à la trace de la pile

Votre trace de pile complète ressemble alors à ceci:

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)

Notes secondaires:

  • Il peut y avoir des cas où aucun cadre n'est répertorié, par exemple:

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

    Cela peut se produire lorsque la cause qu'il a créé dans la même ligne: new HighLevelException(new MidLevelException()). Ne soyez pas confus par cela, l'approche décrite ci-dessus fonctionne toujours, il n'y a tout simplement pas de trames à utiliser pour l'exception, continuez avec celle qui l'entoure.

  • Dans certains cas, vous pouvez enregistrer vous-même le comptage en regardant la première image qui n'a pas été omise (la ligne ci-dessus ... X more). Si vous savez quelles méthodes appellent la méthode dans cette ligne, vous pouvez directement rechercher les appelants dans les cadres de l'exception englobante:

    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
la source