Je veux enregistrer le premier cadre de pile qui est visible depuis mon propre code. Est-il possible de parcourir une trace de pile à partir d'un Throwable - quelque chose de similaire à StackWalker.walk(...)

2
jactor-rises 9 févr. 2021 à 18:50

3 réponses

Meilleure réponse

Le moyen le plus correct est de payer la pénalité et de diffuser le Throwable.getStackTrace() ...

Cela entraînera cependant des problèmes de performances car le jvm doit créer tous les éléments de la trace de la pile (pas seulement ceux que vous voulez) ...

Si payer cette surcharge de performances n'est pas une option, vous devez "parcourir la pile" en utilisant StackWalker de l'API de marche de la pile java 9 ... Cette pile s'écartera de la trace de la pile d'exceptions, et cela doit être pris en compte en marchant sur la pile ...

0
jactor-rises 12 mars 2021 à 07:42

Vous pouvez diffuser les StacktraceElements:

Arrays.stream(throwable.getStackTrace().forEach(element ->{
    if(element.getClassName().startsWith("your.package"){
        logger.info(element.toString());
    }
});
1
frank 9 févr. 2021 à 16:10

La meilleure solution est de diffuser les résultats de Throwable.getStackTrace()

Je sais que vous pouvez diffuser le tableau, mais cela entraînera une surcharge de performances.

En fait, ce ne sera pas le cas. Les frais généraux de capture des cadres de pile et de leur transformation en un tableau de StackFrameElement sont encourus lorsque fillInStackTrace() est appelé. Cela se produit lors de l'instanciation de l'objet Throwable (exception); c'est-à-dire avant vous throw.

Fondamentalement, vous avez déjà pris en charge la surcharge de performances de la création du tableau ... avant de décider si vous souhaitez diffuser les images de la pile ou non.

D'un autre côté, il est possible d'instancier un Throwable (via une sous-classe) avec l'argument writableStackTrace mis à false. Cela inhibe l'appel à fillInStackTrace. Le résultat net est qu'aucune stackframes ne sera capturée ... et il n'y aurait rien à diffuser.

(Et vous ne pouvez pas changer d'avis. Si les stackframes ne sont pas capturés lorsque le Throwable est instancié, ils seront ignorés car la pile est déroulée pendant la propagation de l'exception.)

1
Stephen C 12 mars 2021 à 08:09