Отладка с помощью GDB - 12. Файлы GDB

[Содержание]   [Назад]   [Пред]   [Вверх]   [След]   [Вперед]  


12. Файлы GDB

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

12.1 Команды для задания файлов

Вы можете указать имена исполняемого файла и файла дампа памяти. Обычно это делается во время вызова 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 [ имя-файла ]
Указывает, что программа, которая должна быть выполнена (но не таблица символов), находится в имя-файла. Если необходимо, GDB ищет вашу программу с помощью переменной среды 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 ]
Если вы хотите быть уверены, что у GDB есть вся таблица символов целиком, вы можете отменить двухступенчатую стратегию чтения таблицы символов, используя параметр `-readnow' с любой командой, загружающей информацию таблицы символов. Если отображаемые в память файлы доступны в вашей системе через системный вызов mmap, вы можете использовать другой параметр, `-mapped', чтобы GDB записывал символы для вашей программы в файл многократного использования. Последующие сеансы отладки GDB отображают информацию о символах из этого вспомогательного файла (если программа не изменилась), вместо того, чтобы тратить время на чтение таблицы символов из исполняемой программы. Использование параметра `-mapped' производит такой же эффект, как вызов GDB с ключем командной строки `-mapped'. Вы можете использовать оба параметра вместе, чтобы быть уверенным, что вспомогательный файл символов содержит всю информацию о символах вашей программы. Вспомогательный файл символов для программы myprog называется `myprog.syms'. Если этот файл существует (и создан позже, чем соответствующая исполняемая программа), GDB всегда пытается использовать его при отладке myprog; не требуется никаких специальных ключей или команд. Файл `.syms' является специфичным для рабочей машины, на которой вы вызываете GDB. Он содержит точный образ внутренней таблицы символов GDB. Он не может быть использован одновременно на разных рабочих платформах.
core-file [ имя-файла ]
Определяет местонахождение файла дампа памяти, который будет использован как "содержимое памяти". Обычно файлы дампов памяти содержат только некоторые части адресного пространства процесса, создавшего их; GDB может обращаться к исполняемому файлу за другими частями. 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 рег-выр
Загрузить символы разделяемых библиотек объектов для файлов, удовлетворяющих регулярному выражению Unix. Также как и для автоматически загруженных файлов, это загружает только разделяемые библиотеки, требуемые вашей программой для файла дампа памяти или после ввода run. Если рег-выр опущено, загружаются все разделяемые библиотеки, требуемые вашей программой.

В системах HP-UX, GDB сам определяет загрузку разделяемой библиотеки и автоматически считывает символы из нее, до некоторого изначально установленного порогового значения, которое вы можете при желании изменить.

После этого порогового значения, символы из разделяемых библиотек должны загружаться явно. Для загрузки этих символов, используйте команду sharedlibrary имя-файла. Базовый адрес разделяемой библиотеки определяется GDB автоматически и вы не должны его задавать.

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

set auto-solib-add порог
Устанавливает размер порога автоматической загрузки в мегабайтах. Если порог ненулевой, символы из всех библиотек разделяемых объектов будут загружаться автоматически, когда программа начинает выполнение или когда динамический компоновщик информирует GDB о том, что была загружена новая библиотека, до тех пор, пока таблица символов программы и библиотек не превысит этот порог. В противном случае, символы должны загружаться вручную, при помощи команды sharedlibrary. По умолчанию, порог равен 100 мегабайтам.
show auto-solib-add
Отобразить величину текущего порога автоматической загрузки в мегабайтах.

12.2 Ошибки чтения файлов с символами

При чтении файла символов, GDB иногда сталкивается с такими проблемами, как типы символов, которые он не распознает, или известные ошибки вывода компилятора. По умолчанию, GDB не сообщает вам о таких проблемах, так как они сравнительно общие и прежде всего представляют интерес для людей, занимающихся отладкой компиляторов. Если вам интересна информация о плохо созданных таблицах символов, вы можете запросить GDB печатать только одно сообщение по каждому типу проблем, независимо от того, сколько раз проблема появляется; или вы можете попросить GDB напечатать больше сообщений, чтобы увидеть, сколько раз проблема встречалась, командой set complaints (см. раздел 15.6 Необязательные предупреждения и сообщения).

Печатаемые сообщения и их значения, включают:

inner block not inside outer block in символ
Информация о символах показывает, где области символов начинаются и заканчиваются (например, в начале функции или блока операторов). Эта ошибка указывает на то, что внутренний блок видимости не содержится целиком во внешнем. GDB обходит проблему, рассматривая внутренний блок так, как если бы он имел такую же область видимости, что и внешний. Если внешний блок не является функцией, в данном сообщении символ может быть показан как "(don't known)".
block at адрес out of order
Символьная информация для блоков символьных областей должна появляться в порядке увеличения адресов. Данная ошибка указывает, что это не так. GDB не решает этой проблемы, и у него возникают трудности при определении местоположения символов в исходном файле, символы которого он считывает. (Вы часто можете определить имя поврежденного исходного файла, указав set verbose on. См. раздел 15.6 Необязательные предупреждения и сообщения.)
bad block start address patched
Символьная информация для блоков символьных областей имеет меньший начальный адрес, чем у предшествующей строки исходного текста. Известно, что это происходит в компиляторе Си SunOS 4.1.1 (и более ранних версиях). GDB обходит проблему, обрабатывая блок символьной области как начинающийся с предыдущей исходной строки.
bad string table offset in symbol n
Символ с номером n содержит указатель на таблицу строк, который превосходит размер таблицы. GDB обходит проблему, считая, что символ имеет имя foo, что может вызвать другие проблемы, если много символов заканчиваются этим именем.
unknown symbol type 0xnn
Символьная информация содержит новые типы данных, которые GDB еще не знает, как считывать. 0xnn---это тип символа неверно истолкованной информации, в шестнадцатеричном виде. GDB обходит ошибку, игнорируя эту символьную информацию. Это обычно позволяет вам отладживать программу, хотя некоторые символы и недоступны. Если вы столкнетесь с такой проблемой и желаете ее отладить, вы можете отладить gdb с помощью него же, установив точку останова на complain, затем дойти до функции read_dbx_symtab и исследовать *bufp, чтобы увидеть символ.
stub type has NULL name
GDB не может найти полное определение для структуры или класса.
const/volatile indicator missing (ok if using g++ v1.x), got...
В символьной информации для функции-члена Си++ пропущена некоторая информация, которую последние версии компилятора должны для нее выводить.
info mismatch between compiler and debugger
GDB не может разобрать спецификации типа, выведенной компилятором.


[Содержание]   [Назад]   [Пред]   [Вверх]   [След]   [Вперед]