218 votes

Y a-t-il un moyen pour vider une trace de la pile sans lever d’exception en java ?

Je pense de la création d’un outil de débogage pour mon application Java.

Je me demande si il est possible d’obtenir une trace de la pile, à l’instar de Exception.printStackTrace(), mais sans réellement lever une exception ?

Mon but est de dans n’importe quelle méthode donnée, vider une pile pour voir qui est l’appelant de la méthode.

Toute les réponses ou les pensées concernant ce serait vraiment utiles  :)

343voto

Rob Di Marco Points 18048

Oui, il suffit d’utiliser

89voto

Ram Points 4616

Vous pouvez également essayer Thread.getAllStackTraces() pour obtenir une carte de traces de la pile pour tous les threads qui sont vivants

62voto

Tom Anderson Points 22456

Si vous voulez la trace juste pour le thread courant (plutôt que tous les threads du système, comme la suggestion de Ram), faire:

Fil de discussion.currentThread().getStackTrace()

Pour trouver l'appelant, n':

private String getCallingMethodName() {
    StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
    return callingFrame.getMethodName();
}

Et appeler cette méthode à partir de la méthode qui a besoin de savoir qui à son appelant. Cependant, un mot d'avertissement: l'indice de l'appelant image dans la liste pourrait varier en fonction de la JVM! Tout dépend du nombre de couches d'appels il y a à l'intérieur de getStackTrace avant de vous frappez le point où la trace est généré. Une solution plus robuste serait d'obtenir la trace, et de parcourir à la recherche de l'image pour getCallingMethodName, puis prendre deux étapes jusqu'à trouver le vrai de l'appelant.

44voto

Gerco Dries Points 4319

Vous pouvez obtenir une trace de la pile comme ceci :

Si vous souhaitez accéder à l’image, vous pouvez utiliser t.getStackTrace() pour obtenir un tableau des frames de pile.

Sachez que cette stacktrace (comme n’importe quel autre) peut manquer certains cadrages si le compilateur hotspot a été occupé à optimiser les choses.

18voto

Ariel T Points 656

Notez que Thread.dumpStack() lève en fait une exception :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X