web-dev-qa-db-fra.com

Comment afficher la trace de pile complète sur Eclipse?

J'utilise Eclipse pour déboguer une application Java. Quelque part dans le code, une exception et une trace de pile sont générées:

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

Comment puis-je obtenir la pile entière au lieu du ... 11 more?

39
Luchian Grigore

Vous avez la pile entière. 

Ceci n'est qu'une partie d'une trace de pile. Directement avant c'était un autre morceau. Regardez les lignes inférieures de celle-ci, et les lignes supérieures de la précédente. Vous les verrez correspondre. La trace de la pile a commencé par une section qui ne commence pas par "Caused by".

L'exception "Caused by" masque des parties de la trace de pile qui sont des copies exactes des entrées de trace de pile dans son parent. En d'autres termes, Java ne montre pas l'intégralité de la pile jusqu'à main () pour toutes les causes, mais uniquement ce que vous n'avez pas encore vu. Reportez-vous à la documentation Throwable.printStackTrace () } _.

Le "Causé par" est rempli lorsque vous indiquez une cause lors de la création d'un jetable. Regardez les constructeurs pour cela. Cela est fait quand un morceau de code attrape une exception de bas niveau et veut ensuite le renvoyer en tant que classe d'exception différente. 

28
Ed Staub

les réponses ci-dessus ne sont pas précises. Chaque fois que la pile affiche les mots "causé par", cela signifie que l'exception est passée par une ou plusieurs méthodes jusqu'à ce qu'elle soit interceptée, puis renvoyée. Cela peut arriver très souvent, la trace de la pile n’est pas une boucle, mais une seule direction, donc non, le contenu en haut ne concerne pas le contenu en bas, la partie la plus importante IS à en bas, c’est la racine de l’exception, donc si vous avez:

Exception dans la classe main: bla bla bla ... lignes de code .... causées par FileNotFoundException ... lignes de code .... causées par: MalformedURLException .. .lines de code ... causées par: NullPointerException

alors vous ne voudriez pas vous focaliser autant sur la exception FileNotFoundException, mais plutôt sur la NullPointerException. Comme par exemple, vous aviez un fichier de propriétés avec un nom de fichier. Si myKey est utilisé par inadvertance pour rechercher la propriété "myKey", propertiesResource renverra une valeur null, qui sera ensuite renvoyée dans toutes les lignes de code (espérons-le) à votre application où se trouve le dernier bloc catch. . . ce qui, à ce stade, serait "encapsulé" non pas comme une exception nullException, mais comme une exception FileNotFoundException. . . 

9
bill

 enter image description here

Nous pourrions être en train de diverger du problème auquel il est confronté. J'avais un problème similaire et il s'est avéré que ma case Limit out out case est cochée. Après l'avoir retiré, j'ai pu voir la trace complète de la pile . Étapes: Faites un clic droit sur la console || ctrl + clic si mac allez dans les préférences et suivez les instructions ci-dessus

5
shashwatZing

Je pense que cela signifie que la Exception a été capturée et emballée dans un autre 11 fois avant que printStackTrace ne soit appelé.

Essayez de comprendre le résultat du programme suivant pour une meilleure compréhension:

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");
    }

}
2
Miserable Variable

Comme Ed dit, il montre la pile entière, mais laisse de côté les informations déjà vues. Voir Throwable # printStackTrace ()

Citant à partir de là:

Notez la présence de lignes contenant les caractères "...". Celles-ci les lignes indiquent que le reste de la trace de la pile pour cela exception correspond au nombre indiqué d'images à partir du bas de la trace de pile de l'exception provoquée par cette exception (l'exception "englobante"). Ce raccourci peut considérablement réduire le longueur de la sortie dans le cas habituel où une exception encapsulée est jeté de la même méthode que "l'exception causative" est pris

Souvent une exception est encapsulée; créé avec une autre exception comme cause:

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

Dans ce cas, l'affichage du stacktrace créera le ... 11 plus que ce que vous voyez.

1
Matthew Farwell

Je n'ai jamais vu ça, mais essayez ceci

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

ou

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());
     }
  }
}
1
Ramzi Kahil

Il y a une option vmargs

 -XX:-OmitStackTraceInFastThrow

ce qui pourrait aider dans certaines situations.

0
Martin