2008-10-16 7 views
0

Je sais que je peux obtenir stacktrace en utilisant Thread.getAllStackTraces() (il retourne Map, mais clear ne fonctionne pas). Quand je cours la méthode de récursion je peux obtenir l'exception parce que stacktrace étant trop grand, y a-t-il un moyen de l'effacer?puis-je nettoyer stacktrace?

Répondre

4

Ce n'est pas la trace de la pile qui cause votre problème, c'est la pile elle-même. Chaque fois que vous appelez une méthode, des informations sont placées sur la pile pour vous permettre de revenir à la méthode d'appel. Si vous recursez assez, vous finissez par remplir tout l'espace de la pile (qui est lié par une taille maximale) et votre programme s'arrête. La trace de la pile vous montre simplement votre historique d'appels. Vous avez probablement une récursion infinie et vous devez trouver un moyen de l'arrêter avant que votre programme échoue. Soit il y a une erreur dans votre algorithme ou vous devez trouver un moyen de le résoudre différemment dans les limites de la mémoire à votre disposition.

1

Si vous rencontrez un débordement de pile dû à une récursivité incontrôlée, vous n'avez pas de chance. Le contenu de la pile est nécessaire pour revenir des appels de fonction, il n'y a aucun moyen de le "nettoyer" sensiblement. Le problème n'est pas la carte retournée par getAllStackTraces(), mais plutôt le contenu réel de la pile.

Vous devez restructurer votre code pour qu'il ne se répète pas à un niveau aussi profond.

Vous pouvez également rechercher s'il est possible d'augmenter la taille de la pile, mais si vous avez besoin d'une taille de pile non standard, cela indique généralement une implémentation problématique.

-1

Vérifiez d'abord que votre programme n'a pas de bogue dans son code provoquant une récursion infinie menant au débordement de la pile.

Si ce n'est pas le cas, vous pouvez essayer d'allouer plus d'espace de pile à votre programme. Sous Linux, vous pouvez le faire avec la commande bash ulimit comme:

ulimit -s 8000 

ou même

ulimit -s unlimited 

Si vous avez vraiment besoin pour décompresser la pile, vous pouvez utiliser setjmp/longjump en C ou utiliser des exceptions ou des continuations comme:

struct ClearStack {} ; 

void myLongComputationWhichCausesStackOverflow() { 
    // do something 
    if (needsToClearTheStack) 
    throw ClearStack() ; 
    // do something else 
} 

int main(int ac, char *av[]) { 
    try { 
    mylongcomputation() ; 
    // continuation of program 
    // no stack clearing occurred 
    } 
    catch(const ClearStack & cs) { 
    // the stack was cleared and do something appropriately 
    } 
} 

Il fait ce que vous voulez mais ce n'est pas vraiment un bon style de programmation. Notez que vous devez trouver un moyen de savoir quand effacer la pile. Cela peut être assez difficile car vous ne pouvez pas savoir combien d'espace de pile reste ou si l'appel d'une fonction débordera la pile!

+0

Ceci est une information utile, mais ne s'applique pas à cette question. –

Questions connexes