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

#c #variables #gdb #global-variables

#c #переменные #gdb #глобальные переменные

Вопрос:

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

Ответ №1:

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

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

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

Комментарии:

1. @KennyTM, имена статических переменных в выходных данных info variables должны быть статическими переменными в этом модуле компиляции, верно?

2. @cpuer: Не обязательно. Отображается только имя в таблице символов. Например, с помощью gcc на Mac статическая переменная y переименовывается в y.1913 при компиляции.

3. @KennyTM , разве статические переменные внутри функции не хранятся так же, как статические переменные вне функции (в таблице символов)?

4. @cpuer: Они хранятся одинаково, но названия символов будут отличаться. Предположим, у вас есть статическая переменная y в функции foo и другая y в bar . Чтобы различать их, двум y переменным должно быть присвоено другое имя.

5. @KennyTM , более того, возможно ли получить, где переменная объявлена и определена соответственно?

Ответ №2:

Если вы хотите увидеть локальные переменные вызывающей функции, используйте 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) 
  

Комментарии:

1. ( select-frame может быть сокращено как sel . В качестве альтернативы используйте frame / f , который также печатает фрейм)

Ответ №3:

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

 (gdb) info args
  

Например:

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

argc и argv не будет отображаться info locals . Сообщение будет «Нет локальных».

Ссылка: команда info locals.