Dans GDB, comment puis-je accéder directement au cadre de pile d'appels le plus haut?


9

J'ai un programme C qui sépare les défauts après être descendu profondément dans un désordre récursif infini. Le retour en arrière du processus dans GDB est inutile car la trame de pile d'appels a une profondeur d' au moins 1000 trames, et les appels de fonction répétés sont une série de quatre appels de fonction récursifs communs (donc les points d'arrêt semblent inutiles). Les appels répétés de backtrace ne font que lire les quatre noms de fonction, encore et encore et encore. Il m'est venu à l'esprit que faire 'up' 'up' 'up' ... me ferait monter plus haut, donc je pourrais voir où ce modèle a commencé à se produire, mais il semble qu'il serait plus efficace de commencer à partir de l'appel le plus haut empiler le cadre et descendre à la place, car mon intuition est que la récursion infinie commence tôt dans le processus. Si la pile d'appels avait N trames au total, je sais que je pourrais simplement faire

gdb>> up N

pour arriver en haut de la pile (la Nième trame), mais le problème est que je ne connais pas N. Existe-t-il une commande pour trouver le nombre total de trames dans la pile des appels? Ou, y a-t-il une commande GDB intégrée lisse pour sauter au cadre le plus haut? Il m'est venu à l'esprit que le cadre supérieur devrait être la fonction main () - puis-je tirer parti de ces connaissances pour atteindre le cadre supérieur?

Réponses:


9

Dans mes tests, l'utilisation de 'up' avec un très grand nombre a entraîné l'affichage du cadre le plus haut, par exemple

(gdb) up 99999
#58 0x0000000000442fb4 in main ()

1
Ne fonctionne pas si la taille de la pile est supérieure à 99999
The Vivandiere

Cette réponse a fonctionné pour moi, juste besoin d'utiliser un plus grand nombre.
tesch1

23

Vous pouvez spécifier 'bt' avec un nombre négatif pour commencer à partir du cadre le plus haut:

bt -20

Vous pouvez ensuite utiliser le «cadre» (ou «f») pour accéder directement au cadre que vous souhaitez.


1

fr 0vous amènera au cadre de pile le plus haut. frsignifie cadre.


2
c'est la mauvaise direction
tesch1

@ tesch1 assez juste, mais gdb backtrace vous montre le bas en haut :)
Le Vivandiere
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.