11 votes

Dans GDB, comment puis-je sauter directement au cadre supérieur de la pile d'appels ?

J'ai un programme en C qui fait des fautes après être descendu profondément dans un désordre récursif infini. Retracer le processus dans GDB est inutile car le cadre de la pile d'appels est au moins 1000 trames de profondeur, et les appels de fonction répétés sont des séries de quatre appels de fonction récursifs communs (les points d'arrêt semblent donc inutiles). Les appels répétés au backtrace ne font que lire les quatre noms de fonctions, encore et encore et encore. Il m'est venu à l'esprit que faire 'up' 'up' 'up'... me permettrait de remonter plus haut, afin de voir où ce modèle a commencé à se produire, mais il semble qu'il serait plus efficace de commencer à partir du cadre le plus haut de la pile d'appels et de 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 cadres au total, je sais que je pourrais simplement faire

gdb>> up N

pour atteindre le sommet 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 d'appel ? Ou bien, existe-t-il une commande intégrée à GDB pour sauter à la trame la plus haute ? Il m'est venu à l'esprit que la trame la plus haute devrait être la trame main() Puis-je tirer parti de cette connaissance pour atteindre le cadre le plus haut ?

28voto

user113014 Points 1

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

bt -20

Vous pouvez ensuite utiliser 'frame' (ou 'f') pour accéder directement au cadre que vous souhaitez.

11voto

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

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

1voto

The Vivandiere Points 1442

fr 0 vous amènera au cadre le plus haut de la pile. fr signifie "cadre".

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X