2008-11-14 6 views
2

J'étais débogage à distance d'un débordement de pile à partir d'une fonction récursive. L'IDE de Visual Studio n'affichait que les 1 000 premières images (toutes les mêmes fonctions), mais je devais aller plus loin aussi pour voir quelle était la cause.Débogueur VC pour afficher plus de cadres dans un débordement de pile

Est-ce que quelqu'un sait comment faire monter le VS dans une liste de piles?

Merci.

Répondre

2

Je ne crois pas qu'il existe un moyen de le faire via l'interface utilisateur (ou même un hack de registre). Ma conjecture à la raison est de montrer toutes les images dans une situation de débordement de la pile peut avoir un impact très négatif sur les performances.

La plupart des cadres de pile sont le résultat d'une mauvaise récursivité. Si c'est le cas, vous pouvez probablement définir un point d'arrêt conditionnel sur la fonction cible. Réglez-le pour ne rompre que lorsque le nombre de hits atteint un certain niveau. Je commencerais avec un compte d'environ 1000. Vous devrez peut-être expérimenter un peu pour obtenir le bon nombre, mais cela ne devrait pas prendre plus de quelques essais.

0

Vous pouvez ajouter un paramètre de nombre de récursions temporaire à la fonction et l'affirmer quand il dépasse une valeur maximale. Donnez-lui une valeur par défaut et vous ne devez modifier aucune autre source

void f(int rcount /* = 0 */) 
{ 
Assert(rcount < 1000); 
f(count+1); 
} 
1

Je suggère de remplacer votre méthode de mise au point et utiliser la journalisation pour gérer ce problème. Vous pourriez le trouver plus productif, vous avez juste besoin de choisir soigneusement quoi et quand imprimer.
Toute façon d'analyser quelques milliers de lignes de texte sera beaucoup plus rapide que d'aller jusqu'à quelques milliers de cadres de pile. A MON HUMBLE AVIS.
Et vous pouvez utiliser David's suggérant de contrôler la quantité de données à imprimer (i.e. transmettre des informations pertinentes d'un cycle de récursivité à l'autre)

1

Vous pouvez également essayer WinDbg. Ce n'est pas aussi convivial, mais cela fonctionne parfois là où le débogueur VC ne le fait pas.

1

Je cours dans ce maintenant et puis, ce que je fais est d'ajouter la ligne suivante à la fonction qui est appelée récursive:

static int nest; if (++nest == 100) *(char*)0 = 0; 

Le nombre 100 est arbitraire, souvent à seulement 10 fonctionnera. Ceci limite la récursion, la terminant par une faute de seg. Le débogueur devrait alors vous montrer les images qui ont commencé la récursivité.

0

Vous essayez de résoudre ce problème.

Il devrait y avoir suffisamment de cadres de pile pour vous montrer le modèle d'appel récurrent. Vous devriez déjà recevoir suffisamment de données inférentielles pour comprendre comment un cycle infini d'appels peut se produire.

Une autre idée de piratage pourrait être de réduire drastiquement la taille de votre pile ou d'augmenter artificiellement la taille de chaque image ...

Questions connexes