Когда я пытался отладить исполняемый файл:
(gdb) break +1
No symbol table is loaded. Use the "file" command.
Что это означает точно?
Таблица символов добавляется к исполняемому файлу?
GDB использует два набора символов.
Набор -g - это символы отладки, которые значительно упрощают работу, поскольку позволяют видеть ваш код и просматривать переменные во время отладки.
Другой набор символов включается по умолчанию при компиляции. Это связывающие символы, они находятся в таблице символов ELF (исполняемый связываемый формат). Он содержит намного меньше информации, чем символы отладки, но содержит наиболее важные данные, такие как адреса вещей в вашем исполняемом файле (или библиотеке, или объектном файле). Без этой информации gdb даже не узнает, где находится main, поэтому (gdb) break main
завершится ошибкой.
Если у вас нет отладочных символов (-g), вы все равно сможете (gdb) сломать основной
, но ваш gdb не будет иметь никакого представления о строках кода в вашем исходном коде файл. Когда вы пытаетесь пройти через код, вы будете продвигать только одну машинную инструкцию за раз, а не строку за раз.
Команда удаления часто используется для удаления
символов из исполняемого файла (или другого объектного файла).
Это часто используется, если вы не хотите, чтобы кто-то мог видеть символы, или если вы хотите сэкономить место в файле. Таблицы символов могут стать большими. Strip удаляет как символы отладки, так и символы компоновщика, но у него есть несколько переключателей командной строки, которые могут ограничивать то, что он удаляет.
Если вы запустите команду file
в своей программе, одна из вещей, которые она вам скажет, это погода или нет, исполняемый файл был удален.
$ gcc my_prog.c -o my_prog
$ file my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
$ strip my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
$
Это потому, что вы не компилировали с включенной отладкой. Попробуйте gcc -g file.c
Таблица символов содержит отладочную информацию, которая сообщает отладчику, какие ячейки памяти каким символам соответствуют (например, имена функций и имена переменных) в исходном файле исходного кода. Да, таблица символов обычно хранится внутри исполняемого файла.
GDB сообщает вам, что не может найти эту таблицу. Если вы скомпилировали с помощью gcc, если вы не использовали флаг -g, он не будет включать таблицу символов в файл. Самый простой способ - это перекомпилировать файл с помощью -g. Затем gdb должен автоматически найти информацию о таблице символов.
Добавьте флаг -g к аргументам командной строки gcc или к Makefile, который вы использовали для компиляции программы. (Часто внутри Makefile будет переменная с именем CFLAGS или аналогичная).
Если вы пытаетесь отладить произвольную стороннюю программу, очень часто информация из нее «вырезается». Это сделано для того, чтобы усложнить обратное проектирование и уменьшить размер исполняемого файла. Если у вас нет доступа к исходному коду и вы не можете скомпилировать программу самостоятельно, вам будет очень сложно использовать на ней gdb.