2 votes

Comment puis-je afficher le contenu d'une pile en C ?

J'ai suivi quelques cours en ligne introduisant l'utilisation de stack et ils sont sympathiques mais plutôt théoriques. Par conséquent, j'ai essayé de le comprendre en montrant la pile d'un programme C simple. J'ai trouvé plusieurs méthodes pour le faire et j'ai essayé d'utiliser gdb (backtrace...).

Toutefois, je ne suis en mesure d'afficher les informations sur la pile que lorsque des bogues surviennent. Je me demande s'il existe un moyen d'afficher la pile même si le programme s'exécute correctement ?

3voto

Basile Starynkevitch Points 67055

En théorie, vous ne pouvez pas être sûr qu'il y ait une pile.

Par exemple, un compilateur pourrait en ligne chaque appel de fonction. Ou il pourrait faire tout un programme analyse statique et découvrir qu'aucune pile n'est nécessaire. Ou le compilateur a fait optimiser certains appels comme appels de queue .

De façon plus réaliste, les variables locales à l'intérieur de certaines fonctions pourraient toutes être placées dans des registres (en cas d'optimisation).

En pratique, vous pourriez exécuter votre programme dans un débogueur (comme gdb ) y arrêter le programme (par exemple avec Ctrl C dans votre gdb ), puis exécutez la backtrace (ou bt ) de la commande gdb y examiner la pile du processus débogué.


(les informations ci-dessous sont avancées ; ne vous y trompez pas si vous êtes un débutant ; et faites très attention à ce qui est faisable au moment de la compilation, depuis l'intérieur de votre programme, ou depuis votre débogueur)

Si vous voulez accéder au pile d'appels de manière programmée à l'intérieur d'un programme sous Linux (avec GNU libc), vous pouvez utiliser la fonction fonctions de backtrace (ils ne sont pas standard, et peuvent ne pas fonctionner, en particulier avec de fortes optimisations). Ou encore Ian Taylor libbacktrace (alors mieux vaut compiler tout votre code avec -g depuis libbacktrace utilise les informations de débogage dans DWARF format).

Dans un commentaire, vous avez ajouté :

Je cherche un moyen d'afficher les informations détaillées dans la pile, telles que la valeur des paramètres, des variables, des SP, etc.

Ce n'est pas possible en général (au moment de l'exécution, depuis l'intérieur de votre programme). Les variables et les paramètres ne sont connus que du compilateur (et sont oubliés à l'exécution). Dans le code machine, vous n'avez que des emplacements de mémoire et des registres (et peut-être les trames de la pile, qui pourraient se perdre avec le -fomit-stack-pointer option de compilation ....). De plus, vous compilerez souvent votre code C avec un peu de optimisations et il est probable que certaines variables ne se trouvent pas sur la pile (mais uniquement dans les registres).

Remarquez que C n'a pas introspection ou réflexion non explicite continuations et n'est pas un homoiconique la langue.

2voto

Employed Russian Points 50479

Je me demande s'il existe un moyen d'afficher la pile même si le programme est correctement exécuté ?

Oui : vous pouvez examiner la pile à n'importe quel moment de l'exécution de votre programme : il suffit de placer un point d'arrêt sur l'instruction qui vous intéresse, ou d'effectuer un pas de programme complet.

Par exemple :

(gdb) break main
(gdb) run

... program stops after main prolog
(gdb) where  # examine stack
(gdb) stepi  # execute one instruction
(gdb) where
(gdb) stepi
... repeat until you reach syscall SYS_exit, or until you are too bored to continue

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X