Почему GDB не может найти символ по адресу с информационным символом? - PullRequest
2 голосов
/ 29 апреля 2020

При попытке отладки некоторого простого кода я не мог заставить GDB идентифицировать локальную переменную по адресу памяти с помощью info symbol.

Код был скомпилирован с использованием g++ -g3 -Wall -Wextra.

int main()
{
    int foo = 1234;
    return foo;
}
(gdb) p foo
$1 = 1234
(gdb) p &foo
$2 = (int *) 0x7fffffffd7c4
(gdb) info symbol 0x7fffffffd7c4
No symbol matches 0x7fffffffd7c4.
(gdb) info address foo
Symbol "foo" is a complex DWARF expression:
     0: DW_OP_fbreg -28
.

Почему в этом случае GDB не может идентифицировать переменную? info symbol работает только для глобальных объектов?

1 Ответ

1 голос
/ 29 апреля 2020

Локальные переменные находятся в стеке или, возможно, в регистрах. Доступ к стеку не имеет ничего общего с таблицей символов программы. Как описано в Изучение таблицы символов

Команды, описанные в этой главе, позволяют вам узнать о символах (именах переменных, функций и типов), определенных в вашей программе. Эта информация присуща тексту вашей программы и не изменяется при ее выполнении.

Локальные переменные никогда не являются постоянными в позиции, так как текущая позиция фрейма стека зависит от глубины вызова и многих других вещей. Локальные переменные просто не являются частью таблицы символов программ, поэтому вы не можете просмотреть их с помощью команды symbol.

Вы можете увидеть, что находится в вашей таблице символов, просто вызвав nm из вашей оболочки, возможно, в дополнение к с ++ фильтру, чтобы получить читаемые имена.

> nm|c++filt

...