Czy drukujesz wszystkie zmienne globalne / zmienne lokalne?

337

Jak mogę wydrukować wszystkie zmienne globalne / zmienne lokalne? Czy to możliwe w GDB?

cpuer
źródło

Odpowiedzi:

490

Wpisz, info variablesaby wyświetlić listę „Wszystkie globalne i statyczne nazwy zmiennych”.

Wpisz info localsna listę „Zmienne lokalne bieżącej ramki stosu” (nazwy i wartości), w tym zmienne statyczne w tej funkcji.

Wpisz info argsna listę „Argumenty bieżącej ramki stosu” (nazwy i wartości).

kennytm
źródło
2
@ KennyTM, nazwy zmiennych statycznych na wyjściu info variablespowinny być zmiennymi statycznymi w obrębie tej jednostki kompilacji, prawda?
cuuer
3
@cpuer: Niekoniecznie. Wyświetla tylko nazwę w tabeli symboli. Na przykład w przypadku gcc na Macu zmienna statyczna yjest zmieniana y.1913na kompilację.
kennytm
1
@KennyTM, czy zmienne statyczne wewnątrz funkcji nie są przechowywane w taki sam sposób, jak zmienne statyczne poza funkcją (w tablicy symboli)?
cuuer
2
@cpuer: Są one przechowywane w ten sam sposób, ale nazwy symboli będą różne. Weź pod uwagę, że masz zmienną statyczną yw funkcji, fooa drugą yw bar. Aby je rozróżnić, należy im przypisać inną nazwę y.
kennytm
1
@KennyTM, co więcej, czy można się dowiedzieć, gdzie zmienna jest odpowiednio zadeklarowana i zdefiniowana?
cpuer
110

Jeśli chcesz zobaczyć lokalne zmienne funkcji wywołującej, użyj jej select-framewcześniejinfo locals

Na przykład:

(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
źródło
4
( select-framemoże być skrócone jako sel. Alternatywnie użyj frame/ f, które również wydrukują ramkę)
user202729
27

Ponadto, ponieważ info localsnie wyświetla argumentów funkcji, w której jesteś, użyj

(gdb) info args

Na przykład:

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

argci argvnie będzie pokazywany przez info locals. Pojawi się komunikat „Brak lokalnych mieszkańców”.

Odwołanie: polecenie info locals .

Jewgienij Siergiejew
źródło
Jedno prawdziwe odniesienie jest tutaj: sourceware.org/gdb/current/onlinedocs/gdb/Frame-Info.html
Johan Boulé