GDB должен знать имя файла программы, которая будет отлаживаться, чтобы прочитать его таблицу символов и чтобы запустить его. Для отладки дампа памяти от предыдущего выполнения, вы также должны сообщить GDB имя этого файла.
Вы можете указать имена исполняемого файла и файла дампа памяти. Обычно это делается во время вызова GDB, используя параметры с командами запуска GDB (см. раздел 2. Вход и выход из GDB).
Иногда во время сеанса GDB необходимо перейти к другому файлу. Или вы можете запустить GDB, забыв указать файл, который хотите использовать. В таких ситуациях полезны команды GDB для задания новых файлов.
file имя-файла
run
. Если вы не укажете каталог, и файл
не будет найден в рабочем каталоге GDB, он использует переменную
среды PATH
в качестве списка каталогов для поиска, точно так
же, как это делает оболочка, когда ищет программу для выполнения.
Используя команду path
, вы можете изменить значение этой
переменной как для GDB, так и для вашей программы.
В системах с отображаемыми в память файлами, информация из таблицы
символов для имя-файла может храниться во вспомогательном файле
`имя-файла.syms'. Если это так, GDB осуществляет
отображение таблицы символов из `имя-файла.syms', запускаясь
намного быстрее. Смотрите описания ключей файлов `-mapped' и
`-readnow' (доступных с командной строки и в командах
file
, symbol-file
или add-symbol-file
, описанных
ниже), для получения большей информации.
file
file
без параметров велит GDB уничтожить любую имеющуюся
информацию как об исполняемом файле, так и о таблице символов.
exec-file [ имя-файла ]
PATH
. Отсутствие имя-файла означает, что необходимо
уничтожить информацию о выполняемом файле.
symbol-file [ имя-файла ]
PATH
. Для получения таблицы символов и исполняемой программы из
одного и того же файла, используйте команду file
.
symbol-file
без параметров сбрасывает информацию GDB о
таблице символов вашей программы.
Команда symbol-file
велит GDB забыть содержимое своих
вспомогательных переменных, историю значений и все точки останова и выражения
автоматического отображения, так как они могут содержать указатели
на внутренние данные, хранящие символы и типы данных, которые
являются частью данных старой таблицы символов, уничтоженной внутри
GDB.
symbol-file
не повторяется, если вы снова нажимаете RET
после первого выполнения.
Когда GDB сконфигурирован для определенной среды, он распознает
отладочную информацию в том формате, который обычно генерируется
для этой среды; вы можете использовать или компилятор GNU, или другие
компиляторы, которые придерживаются местных соглашений. Наилучшие
результаты обычно достигаются с помощью компилятора GNU;
например, используя gcc
, вы можете создавать отладочную
информацию для оптимизированного кода.
Для большинства типов объектных файлов, за исключением старых систем
SVR3, использующих COFF, команда symbol-file
обычно не считывает
таблицу символов сразу целиком. Вместо этого, она быстро сканирует
ее для определения, какие исходные файлы и символы в ней
присутствуют. Детали читаются позже, по одному исходному файлу за раз,
по мере необходимости.
Такая стратегия чтения в две стадии используется для того, чтобы
GDB вызывался быстрее. За исключением редких пауз, чтение
деталей таблицы символов для конкретного исходного файла в большинстве
случаев практически незаметно. (Команда set verbose
позволяет при желании превратить эти паузы в сообщения.
См. раздел 15.6 Необязательные предупреждения и сообщения.)
Мы еще не реализовали двухступенчатую стратегию чтения для COFF. Когда
таблица символов сохранена в формате COFF, symbol-file
считывает данные
таблицы символов сразу полностью. Заметьте, что "stabs-in-COFF" все
же реализует двухступенчатую стратегию, так как отладочная информация
реально хранится в формате stabs.
symbol-file имя-файла [ -readnow ] [ -mapped ]
file имя-файла [ -readnow ] [ -mapped ]
mmap
, вы можете использовать другой параметр,
`-mapped', чтобы GDB записывал символы для вашей программы
в файл многократного использования. Последующие сеансы отладки
GDB отображают информацию о символах из этого вспомогательного
файла (если программа не изменилась), вместо того, чтобы
тратить время на чтение таблицы символов из исполняемой программы.
Использование параметра `-mapped' производит такой же эффект, как
вызов GDB с ключом командной строки `-mapped'.
Вы можете использовать оба параметра вместе, чтобы быть уверенным,
что вспомогательный файл символов содержит всю информацию о символах
вашей программы.
Вспомогательный файл символов для программы прог называется
`прог.syms'. Если этот файл существует (и создан позже,
чем соответствующая исполняемая программа), GDB всегда пытается
использовать его при отладке прог; не требуется никаких
специальных ключей или команд.
Файл `.syms' является специфичным для рабочей машины, на которой вы
вызываете GDB. Он содержит точный образ внутренней таблицы
символов GDB. Он не может быть использован одновременно на
разных рабочих платформах.
core-file [ имя-файла ]
core-file
без параметра указывает, что файл дампа памяти
использоваться не должен.
Обратите внимание, что файл дампа памяти игнорируется, если в данное
время ваша программа выполняется под управлением GDB. Так что
если вы выполняли программу и желаете вместо этого отладить файл
дампа, вы должны убить подпроцесс, в котором выполняется ваша программа.
Для этого используйте команду kill
(см. раздел 4.8 Уничтожение дочернего процесса).
add-symbol-file имя-файла адрес
add-symbol-file имя-файла адрес [ -readnow ] [ -mapped ]
add-symbol-file имя-файла -sраздел адрес
add-symbol-file
считывает дополнительную информацию
таблицы символов из файла имя-файла. Вы должны использовать эту
команду, если файл имя-файла был динамически загружен (другими
средствами) в выполняющуюся программу. Адрес должен быть адресом
памяти, по которому был загружен файл; GDB сам его определить
не может. Вы можете указать дополнительно произвольное количество пар
`-s раздел адрес', чтобы явно указать имя раздела и
базовый адрес для него. Вы можете указать произвольный адрес как
выражение.
Таблица символов из файла имя-файла добавляется к таблице,
изначально считанной по команде symbol-file
. Вы можете
использовать команду add-symbol-file
произвольное число раз;
прочитанные таким образом символьные данные добавляются к старым. Чтобы
уничтожить все старые данные, используйте команду symbol-file
без
аргументов.
Команда add-symbol-file
не повторяется, если вы нажимаете
RET после ее использования.
Чтобы изменить способ обработки GDB таблицы символов для
имя-файла, вы можете использовать параметры `-mapped' и
`-readnow' так же, как и с командой symbol-file
.
add-shared-symbol-file
add-shared-symbol-file
может быть использована только для
Motorola 88k в операционной системе Harris CXUX. GDB
ищет разделяемые библиотеки автоматически, однако, если он не находит
ваших, вы можете выполнить add-shared-symbol-file
. Эта команда
не имеет аргументов.
section
section
изменяет базовый адрес раздела раздел
выполняемого файла на адрес. Это может быть использовано, если
выполняемый файл не содержит адресов разделов (что имеет место для
формата a.out), или когда адреса, указанные в самом файле, неверны.
Каждый раздел должен изменяться отдельно. Команда info files
,
описанная ниже, перечисляет все разделы и их адреса.
info files
info target
info files
и info target
являются синонимами; они обе
выводят текущую цель (см. раздел 13. Определение отладочной цели), включая имена выполняемого файла и файла дампа памяти, используемых
GDB, и файлов, из которых были загружены символы. Команда
help target
выводит все возможные цели, а не только текущую.
Все команды для задания файлов допускают в качестве аргументов как абсолютные, так и относительные имена файлов. GDB всегда преобразовывает имя файла к абсолютному и запоминает его в таком виде.
GDB поддерживает разделяемые библиотеки на HP-UX, SunOS, SVr4, Irix 5 и IBM RS/6000.
Когда вы даете команду run
, или когда исследуете
файл дампа памяти, GDB автоматически загружает определения
символов из разделяемых библиотек. (Однако, если вы не отлаживаете файл дампа,
GDB не понимает ссылки на функции из разделяемой библиотеки до
того, как вы выполните команду run
.)
На HP-UX, если программа загружает разделяемую библиотеку явно,
GDB автоматически загружает символы в момент вызова
shl_load
.
info share
info sharedlibrary
sharedlibrary рег-выр
share рег-выр
run
. Если рег-выр опущено, загружаются все разделяемые
библиотеки, требуемые вашей программой.
В системах HP-UX, GDB сам определяет загрузку разделяемой библиотеки и автоматически считывает символы из нее до некоторого изначально установленного порогового значения, которое вы можете при желании изменить.
После этого порогового значения символы из разделяемых библиотек должны
загружаться явно. Для загрузки этих символов используйте команду
sharedlibrary имя-файла
. Базовый адрес разделяемой
библиотеки определяется GDB автоматически и вы не
должны его задавать.
Для отображения или установки порогового значения используйте следующие команды:
set auto-solib-add порог
sharedlibrary
. По
умолчанию порог равен 100 мегабайтам.
show auto-solib-add
При чтении файла символов, GDB иногда сталкивается с такими
проблемами, как типы символов, которые он не распознает, или известные
ошибки вывода компилятора. По умолчанию, GDB не сообщает вам о таких
проблемах, так как они сравнительно общие и прежде всего представляют
интерес для людей, занимающихся отладкой компиляторов. Если вам интересна
информация о плохо составленных таблицах символов, вы можете запросить
GDB печатать только одно сообщение по каждому типу проблем,
независимо от того, сколько раз проблема появляется; или вы можете
попросить GDB напечатать больше сообщений, чтобы увидеть, сколько раз
проблема встречалась, командой set complaints
(см. раздел 15.6 Необязательные предупреждения и сообщения).
Печатаемые сообщения и их значения, включают:
inner block not inside outer block in символ
(don't known)
".
block at адрес out of order
set verbose on
. См. раздел 15.6 Необязательные предупреждения и сообщения.)
bad block start address patched
bad string table offset in symbol n
foo
,
что может вызвать другие проблемы, если много символов
заканчиваются этим именем.
unknown symbol type 0xnn
0xnn
-- это тип символа неверно
истолкованной информации, в шестнадцатеричном виде.
GDB обходит ошибку, игнорируя эту символьную информацию. Это
обычно позволяет вам отлаживать программу, хотя некоторые
символы и недоступны. Если вы столкнетесь с такой проблемой и
захотите ее отладить, вы можете отладить gdb
с помощью
него же, установив точку останова на complain
, затем дойти до
функции read_dbx_symtab
и исследовать *bufp
, чтобы
увидеть символ.
stub type has NULL name
const/volatile indicator missing (ok if using g++ v1.x), got...
info mismatch between compiler and debugger