Alle globalen Variablen / lokalen Variablen drucken?

337

Wie kann ich alle globalen Variablen / lokalen Variablen drucken? Ist das in gdb möglich?

cpuer
quelle

Antworten:

488

Geben Sie ein, info variablesum "Alle globalen und statischen Variablennamen" aufzulisten.

Geben Sie ein, info localsum "Lokale Variablen des aktuellen Stapelrahmens" (Namen und Werte) aufzulisten, einschließlich statischer Variablen in dieser Funktion.

Geben Sie ein, info argsum "Argumente des aktuellen Stapelrahmens" (Namen und Werte) aufzulisten.

kennytm
quelle
2
@ KennyTM, die statischen Variablennamen in der Ausgabe von info variablessollten statische Variablen innerhalb dieser Kompilierungseinheit sein, oder?
cpuer
3
@cpuer: Nicht unbedingt. Es wird nur der Name in der Symboltabelle angezeigt. Zum Beispiel mit gcc auf dem Mac eine statische Variable ywird umbenannt y.1913auf Kompilierung.
Kennytm
1
@KennyTM, werden statische Variablen innerhalb der Funktion nicht genauso gespeichert wie statische Variablen außerhalb der Funktion (in der Symboltabelle)?
cpuer
2
@cpuer: Sie werden auf die gleiche Weise gespeichert, aber die Symbolnamen unterscheiden sich. Angenommen, Sie haben eine statische Variable yin der Funktion foound eine andere yin bar. Um sie zu unterscheiden, muss den beiden ein anderer Name zugewiesen werden y.
Kennytm
1
@KennyTM ist es außerdem möglich zu ermitteln, wo eine Variable deklariert bzw. definiert ist?
cpuer
110

Falls Sie die lokalen Variablen einer aufrufenden Funktion sehen möchten, verwenden Sie diese select-framezuvorinfo locals

Z.B:

(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
quelle
4
( select-framekann abgekürzt werden als sel. Alternativ verwenden Sie frame/ f, die auch den Rahmen drucken)
user202729
27

info localsVerwenden Sie außerdem, da die Argumente für die Funktion, in der Sie sich befinden, nicht angezeigt werden

(gdb) info args

Zum Beispiel:

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

argcund argvwird nicht von angezeigt info locals. Die Nachricht lautet "Keine Einheimischen".

Referenz: Befehl info local .

Evgeni Sergeev
quelle
Die einzig
Johan Boulé