#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.