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.