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.