GDB использует имя переменной для доступа к имени локальной переменной

GDB предоставляет команду "print localx", которая печатает значение, хранящееся в переменной localx. Таким образом, он должен использовать таблицу символов, чтобы найти отображение (localx -> addressx в стеке). Я не могу понять, как можно создать это отображение.

Я попытался изучить промежуточные временные файлы gcc, используя опцию -save-temps, и заметил, что локальная переменная local1 была сопоставлена ​​с именем символа "LASF8". Однако утилита objdump не показала это имя символа.

Контекст: я работаю над проектом, который требует создания инструмента для вывода доступа к локальным переменным. Учитывая функцию, я хотел бы сказать, что этот адрес соответствует имени этой переменной. Это требует чтения таблицы символов, чтобы соответствовать адресу записи таблицы символов. GDB делает точное обратное отображение. Следовательно, я хотел бы понять то же самое.

1 ответ

Решение

Таблица символов содержится в отладочной информации. Эта информация отладки испускается gcc -g, GDB, кроме всего прочего, читает отладочную информацию, чтобы получить символическую информацию.

Обычно отладочная информация представлена ​​в формате DWARF. См. http://www.dwarfstd.org/ для спецификации.

Вы также можете увидеть DWARF более непосредственно, используя readelf, Например readelf -wi покажет основную (".debug_info") отладочную информацию для файла ELF.

Обратите внимание, что сделать сопоставление в обратном порядке, то есть присвоить имя каждому слоту стека, не совсем легко. Во-первых, не каждый слот стека будет иметь имя. Это потому, что компилятор может пролить временные значения в стек. Во-вторых, многие местные жители будут иметь выражения местоположения DWARF для представления своего местоположения. Это означает, что вам нужно написать оценщик выражений (не сложно, но и не тривиально); Вы могли бы предположительно (маловероятно на практике, но возможно в теории) столкнуться с выражениями, которые не могут быть оценены без реального фрейма стека; и, наконец, имена, как правило, будут действительны только на данном ПК.

Я считаю, что в gdb bugzilla есть запрос на добавление этой функции в gdb.

Другие вопросы по тегам