Печать всех глобальных переменных / локальных переменных?

337

Как я могу распечатать все глобальные переменные / локальные переменные? Это возможно в GDB?

cpuer
источник

Ответы:

490

Введите info variablesсписок «Все глобальные и статические имена переменных».

Введите info localsсписок «Локальные переменные текущего фрейма стека» (имена и значения), включая статические переменные в этой функции.

Введите info argsсписок «Аргументы текущего стекового фрейма» (имена и значения).

kennytm
источник
2
@ KennyTM, имена статических переменных в выходных данных info variablesдолжны быть статическими переменными в этом модуле компиляции, верно?
процессор
3
@cpuer: не обязательно. Он отображает только имя в таблице символов. Например, с gcc на Mac статическая переменная yпереименовывается в y.1913компиляцию.
Кеннитм
1
@KennyTM, статические переменные внутри функции не хранятся так же, как статические переменные вне функции (в таблице символов)?
cpuer
2
@cpuer: они хранятся одинаково, но имена символов будут разными. Предположим, у вас есть статическая переменная yв функции fooи другая yв bar. Чтобы отличить их, другое имя должно быть присвоено двум y.
Kennytm
1
@KennyTM, более того, возможно ли получить, где переменная объявлена ​​и определена соответственно?
процессор
110

Если вы хотите увидеть локальные переменные вызывающей функции, используйте select-frameпередinfo locals

Например:

(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) 
Самуэль Ослунд
источник
4
( select-frameможет быть сокращено как sel. Альтернативно используйте frame/ f, который также печатает рамку)
user202729
27

Кроме того, поскольку info localsне отображаются аргументы функции, в которой вы находитесь, используйте

(gdb) info args

Например:

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

argcи argvне будет показано info locals. Сообщение будет "Нет местных жителей".

Справка: команда info locals .

Евгений Сергеев
источник
Единственная верная ссылка здесь: sourceware.org/gdb/current/onlinedocs/gdb/Frame-Info.html
Йохан Буле