Imprimer toutes les variables globales / variables locales?

337

Comment imprimer toutes les variables globales / variables locales? Est-ce possible dans gdb?

cpuer
la source

Réponses:

490

Tapez info variablespour répertorier "Tous les noms de variables globales et statiques".

Tapez info localspour répertorier les «variables locales du cadre de pile actuel» (noms et valeurs), y compris les variables statiques dans cette fonction.

Tapez info argspour lister "Arguments du cadre de pile actuel" (noms et valeurs).

kennytm
la source
2
@ KennyTM, les noms des variables statiques en sortie de info variablesdevraient être des variables statiques dans cette unité de compilation, non?
cpuer
3
@cpuer: Pas nécessairement. Il affiche uniquement le nom dans la table des symboles. Par exemple, avec gcc sur Mac, une variable statique yest renommée y.1913lors de la compilation.
kennytm
1
@KennyTM, les variables statiques à l'intérieur de la fonction ne sont-elles pas stockées de la même manière que les variables statiques à l'extérieur de la fonction (dans la table des symboles)?
cpuer
2
@cpuer: Ils sont stockés de la même manière mais les noms des symboles seront différents. Considérez que vous avez une variable statique yen fonction fooet une autre yen bar. Pour les distinguer, un nom différent doit être attribué aux deux y.
kennytm
1
@KennyTM, encore plus, est-il possible d'obtenir où une variable est déclarée et définie respectivement?
cpuer
110

Au cas où vous voudriez voir les variables locales d'une fonction appelante utiliser select-frameavantinfo locals

Par exemple:

(gdb) bt
#0  0xfec3c0b5 in _lwp_kill () from /lib/libc.so.1
#1  0xfec36f39 in thr_kill () from /lib/libc.so.1
#2  0xfebe3603 in raise () from /lib/libc.so.1
#3  0xfebc2961 in abort () from /lib/libc.so.1
#4  0xfebc2bef in _assert_c99 () from /lib/libc.so.1
#5  0x08053260 in main (argc=1, argv=0x8047958) at ber.c:480
(gdb) info locals
No symbol table info available.
(gdb) select-frame 5
(gdb) info locals
i = 28
(gdb) 
Samuel Åslund
la source
4
( select-framepeut être abrégé en sel. Vous pouvez également utiliser frame/ f, qui imprime également le cadre)
user202729
27

De plus, comme info localsn'affiche pas les arguments de la fonction dans laquelle vous vous trouvez, utilisez

(gdb) info args

Par exemple:

int main(int argc, char *argv[]) {
    argc = 6*7;    //Break here.
    return 0;
}

argcet argvne sera pas montré par info locals. Le message sera "Pas d'habitants".

Référence: commande info locals .

Evgeni Sergeev
la source
La seule vraie référence est ici: sourceware.org/gdb/current/onlinedocs/gdb/Frame-Info.html
Johan Boulé