Подтвердить что ты не робот

Как загрузить несколько файлов символов в gdb

Как загрузить несколько файлов символов в gdb. У меня есть исполняемый файл foo.out и загрузка модуля bar.so. Я создал два файла символов foo.symbol и bar.symbol. Как загрузить оба файла в gdb.

# gdb --core core
# (gdb) 
# (gdb) symbol-file foo.symbol

Как загрузить второй файл символа. Или есть способ загрузить все файлы каталога в gdb

4b9b3361

Ответ 1

Для установки каталога, содержащего файл символов, используйте

set debug-file-directory <directory>

и использовать

show debug-file-directory

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

Файлы символов автоматически считываются из этого каталога, если их имя (без пути) предоставляется двоичным файлом в терминах отладочной ссылки.


Чтобы добавить дополнительные символы, вы можете использовать add-symbol-file.

(поскольку в данный момент GDB onlinedocs недоступен, я цитирую это здесь)

адрес файла имени файла добавления символа

адрес имени файла файла добавочного символа [-readnow] [-mapped]

add-символ файл имя файла -ssection адрес...

Команда add-symbol-file считывает дополнительную информацию из таблицы символов из имени файла. Вы бы использовали эту команду, когда имя файла было динамически загружено (каким-либо другим способом) в работающую программу. адрес должен быть адресом памяти, по которому файл был загружен; GDB не может понять это для себя. Вы можете дополнительно указать произвольное количество пар адресов -ssection address, чтобы дать явное имя раздела и базовый адрес для этого раздела. Вы можете указать любой адрес в качестве выражения.

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

Хотя filename обычно является файлом общей библиотеки, исполняемым файлом или каким-либо другим объектным файлом, который полностью перемещен для загрузки в процесс, вы также можете загрузить символическую информацию из перемещаемых файлов .o, если:

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

Некоторые встроенные операционные системы, такие как Sun Chorus и VxWorks, могут загружать перемещаемые файлы в уже запущенную программу; такие системы, как правило, облегчают выполнение вышеуказанных требований. Однако важно понимать, что многие собственные системы используют сложные процедуры линковки (например, факторинг секций .linkonce и сборка таблицы конструктора C++), которые затрудняют выполнение требований. В общем, нельзя предполагать, что использование add-symbol-file для чтения символической информации о перемещаемом объектном файле будет иметь тот же эффект, что и обычное связывание перемещаемого объектного файла с программой.

add-symbol-file не повторяется, если вы нажмете после его использования.

Вы можете использовать -mapped' and -readnow' так же, как с командой symbol-file, чтобы изменить способ, которым GDB управляет информацией таблицы символов для имени файла.

Ответ 3

Вместо того, чтобы пытаться загрузить символы вручную в правильное местоположение, я обнаружил, что удобнее объединить символы обратно с eu-unstrip исполняемыми eu-unstrip с помощью eu-unstrip а затем воспроизвести сбой с уже имеющимися символами.

Этот подход не зависит от файлов символов, соответствующих схеме именования, требуемой механизмами разрешения пути (отладочная ссылка и идентификатор сборки), которые используются при установке debug-file-directory.

Ответ 5

Дополнительные символы могут быть загружены в сеанс отладки gdb с помощью:

add-symbol-file filename address

Параметр address - это адрес для секции .text. Этот адрес можно получить с помощью:

readelf -WS path/to/file.elf | grep .text | awk '{ print "0x"$5 }'

Это можно автоматизировать в gdb, добавив следующую запись в ~/.gdbinit:

define add-symbol-file-auto
  # Parse .text address to temp file
  shell echo set \$text_address=$(readelf -WS $arg0 | grep .text | awk '{ print "0x"$5 }') >/tmp/temp_gdb_text_address.txt

  # Source .text address
  source /tmp/temp_gdb_text_address.txt

  #  Clean tempfile
  shell rm -f /tmp/temp_gdb_text_address.txt

  # Load symbol table
  add-symbol-file $arg0 $text_address
end

После определения выше функции add-symbol-file-auto можно использовать загрузить дополнительные символы:

(gdb) add-symbol-file-auto path/to/1.elf
add symbol table from file "path/to/1.elf" at
    .text_addr = 0x8010400
(gdb) add-symbol-file-auto path/to/2.elf
add symbol table from file "path/to/2.elf" at
    .text_addr = 0x8000000
(gdb) break main
Breakpoint 1 at 0x8006cb0: main. (2 locations)
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   <MULTIPLE> 
1.1                         y     0x08006cb0 in main() at ./source/main.cpp:114
1.2                         y     0x080106a6 in main() at ./main.cpp:10
(gdb)