2010-10-06 4 views
14

Quelqu'un pourrait-il me donner un aperçu rapide/me montrer la documentation d'un moyen d'inspecter la pile (et le tas?) D'un programme C? Je pensais que cela devrait être fait avec GDB, mais s'il y a d'autres alternatives plus directes, alors cela devrait aussi bien se passer.comment utiliser gdb pour explorer la pile/tas?

Merci.

+0

Quel système d'exploitation utilisez-vous? –

+0

Ah, désolé, oui: OS: Ubuntu Linux, Compilateur: GCC. –

Répondre

2

Ma première approche de l'utilisation de GDB pour le débogage consiste à configurer des points d'arrêt. Ceci est fait comme si-

prompt> gdb ./x_bstree.c 
(gdb) #prompt 
(gdb) b 123 #break at line 123 
(gdb) r #start program 

Maintenant votre programme s'arrête à la ligne 123 de votre programme. Vous pouvez maintenant examiner les variables dans une pile ou un tas en utilisant print. Pour les variables de pile, utilisez simplement print <varname>. Pour les variables de tas (pointeurs), utilisez print <*varname>. Vous n'êtes pas sûr qu'il y a quelque chose de spécial à faire pour examiner les variables de pile/tas?

Bien sûr, pour déboguer des applications multithread vous devez le faire fonctionner en mode mono-thread & puis dubug Sinon, il devient difficile de prévoir ce qui se passe.

Pour toute autre chose il y a une documentation complète de gdb & De nombreux sites proposent également gdb cheat sheets

3

Essayez d'utiliser ddd. ddd manual

Ok. Peut-être que j'élabore un peu. Je l'utilise comme ça.

compiler mon programme avec des symboles de débogage:

gcc -g program.c -o program 

course ddd:

ddd program 

En IUG vous pouvez faire toutes sortes de choses, vue code machine, voir la mémoire, etc.. Regarde autour de toi. Dans le manuel il y a aussi une section de pile d'examen. ddd fournit une bonne interface pour vous pour examiner le programme C.

+0

Je pensais que ddd était juste un frontal pour gdb, non? –

+0

Je l'ai trouvé plus pratique que gdb. En gui, vous pouvez regarder plusieurs choses à la fois. Dans gdb je défile tout le temps. –

+0

Il s'agit juste d'un frontal pour gdb, voir [mise à jour manuelle de l'emplacement] (http://www.gnu.org/software/ddd/manual/html_mono/ddd.html). Cependant, il peut être beaucoup plus simple pour certains types de flux de travail qu'un outil de console uniquement. – starturtle

12

vous pouvez vider la mémoire brute avec la commande « x »

donc si vous voulez regarder des morceaux de l'essayer pile ou tas des choses comme

x/10b &stackvar 
x/200b &heapvar-20 

Le dernier vous montrera 200 octets à partir de 20 octets avant heapvar.Donc, si vous venez malloced que vous pouvez voir l'en-tête de tas trop

+0

J'aime votre approche! Y at-il un bon plugin gdb qui permet d'examiner le tas montrant ses données de morceaux, en-têtes, bits en cours d'utilisation et autres? Je viens de trouver [gdb-heap] (https://fedorahosted.org/gdb-heap/). Malheureusement, il semble assez démodé et non maintenu. – rc0r

0

Voir pile: gdb> backtrace

Voir cadre de la pile actuelle: gdb> info frame

Voir les arguments du cadre actuel de la pile: gdb> info args

Afficher la variable locale du cadre de pile actuel: gdb> info locals

Accédez au cadre de pile mère: gdb> frame 1

Examining the Stack

Questions connexes