Прежде чем выполнять программу под управлением GDB, при компиляции вы должны сгенерировать отладочную информацию.
Вы можете запустить GDB с параметрами или без, в любой среде по вашему выбору. Если вы отлаживаете программу на той же машине, на которой выполняется GDB, вы можете перенаправить ввод и вывод вашей программы, отлаживать уже выполняющийся процесс, или убить дочерний процесс.
Чтобы запросить генерацию отладочной информации, укажите ключ `-g' при вызове компилятора.
Многие компиляторы Си не могут обрабатывать ключи `-g' и `-O' вместе. Используя такие компиляторы, вы не можете создавать оптимизированные выполняемые файлы, содержащие отладочную информацию.
GCC, GNU компилятор Си, поддерживает `-g' с или без `-O', делая возможным отладку оптимизированного кода. Мы рекомендуем, чтобы вы всегда использовали `-g' при компиляции программ. Вы можете думать, что ваша программа правильная, но нет никакого смысла испытывать удачу.
Когда вы отлаживаете программу, откомпилированную с `-g -O', помните, что оптимизатор перестраивает ваш код; отладчик же показывает то, что там находится в действительности. Не удивляйтесь, если порядок выполнения не будет в точности соответствовать вашему исходному файлу! Крайний пример: если вы определяете переменную, но нигде ее не используете, GDB никогда не увидит этой переменной, потому что при оптимизации компилятор ее исключит.
Некоторые вещи не работают с `-g -O' также, как просто с `-g', в частности, на машинах с планированием инструкций. Если сомневаетесь, перекомпилируйте с одним ключем `-g', и если это устранит проблему, пожалуйста, сообщите нам об этом как об ошибке (включите тестовый пример!).
Ранние версии компилятора GNU Си допускали вариант ключа для отладочной информации `-gg'. GDB больше не поддерживает этот формат; если этот ключ есть у вашего компилятора GNU Си, не используйте его.
Выполнение программы зависит от определенной информации, которую она получает от породившего ее процесса. GDB предоставляет способы задать эту информацию, что вы должны сделать до запуска программы. (Вы можете изменить ее после старта, но такие изменения воздействуют на вашу программу только при следующем запуске.) Эта информация может быть разделена на четыре категории:
Предупреждение: Хотя перенаправление ввода и вывода работает, вы не можете использовать каналы для передачи выходных данных отлаживаемой программы другой программе; если вы попытаетесь это сделать, скорее всего GDB перейдет к отладке неправильной программы.
Когда вы подаете команду run, ваша программа начинает выполняться немедленно. See section Остановка и продолжение исполнения, для обсуждения того, как остановить вашу программу. Как только ваша программа остановилась, вы можете вызывать функции вашей программы, используя команды print или call. See section Исследование данных.
Если время модификации вашего символьного файла изменилось с того момента, когда GDB последний раз считывал символы, он уничтожает свою символьную таблицу и считывает ее заново. При этом GDB старается сохранить ваши текущие точки останова.
В не-Unix системах, программу обычно запускает непосредственно GDB, который эмулирует перенаправление ввода-вывода через соответствующие системные вызовы, и символы шаблонов раскрываются кодом запуска, а не оболочкой.
run без аргументов использует те же аргументы, которые использовались предыдущей командой run, или которые установлены командой set args.
Вы можете использовать строку `cwd', чтобы сослаться на рабочий каталог, который является текущим в тот момент, когда GDB производит поиск. Если вместо этого вы используете `.', то она будет указывать на тот каталог, в котором вы выполнили команду path. GDB заменяет `.' в аргументе каталог (на текущий путь) до добавления каталога к списку путей поиска.
set env USER = foo
Предупреждение: В системах Unix, GDB вызывает вашу программу, используя оболочку, указанную вашей переменной среды SHELL, если она определена (или /bin/sh, если не определена). Если ваша переменная SHELL указывает на оболочку, которая выполняет файл инициализации---такой как `.cshrc' для оболочки C-shell, или `.bashrc' для BASH---любая переменная, которую вы установите в этом файле, воздействует на вашу программу. В этой связи, вы можете захотеть перенести установку переменных среды в файлы, которые выполняются только при вашем входе в систему, такие как `.login' или `.profile'.
Рабочий каталог GDB также служит каталогом по умолчанию для команд отладчика, определяющих действия с файлами. See section Команды для задания файлов.
run > выходной-файл
Другой способ задать, как ваша программа должна осуществлять ввод и вывод---использовать команду tty. Эта команда принимает в качестве агрумента имя файла, который будет использоваться по умолчанию для будущих команд run. Эта команда также сбрасывает управляющий терминал для дочернего процесса для будущих команд run. Например,
tty /dev/ttyb
Явное перенаправление в run замещает эффект команды tty для устройств ввода-вывода, но не ее воздействие на управляющий терминал.
Когда вы используете команду tty или перенаправляете ввод в команде run, изменяется только ввод для вашей программы. Ввод для GDB по прежнему происходит через ваш терминал.
Чтобы использовать attach, ваша программа должна выполняться в среде, поддерживающей процессы; например, attach не работает на специальных машинах, не имеющих операционной системы. Вы также должны обладать полномочиями для посылки сигнала процессу.
Когда вы используете attach, отладчик находит программу выполняющегося процесса, производя поиск сперва в текущем рабочем каталоге, а затем (если программа не найдена), используя пути поиска исходных файлов (see section Определение каталогов с исходными файлами). Также, для загрузки программы вы можете использовать команду file. See section Команды для задания файлов.
Первое, что GDB делает после подготовки указанного процесса к отладке---останавливает его. Вы можете исследовать и изменять присоединенный процесс всеми командами GDB, которые обычно доступны, когда вы запускаете процессы с помощью run. Вы можете устанавливать точки останова; вы можете пошагово выполнять программу и продолжить ее обычное выполнение, вы можете изменять области данных. Если вы решите продолжить выполнение процесса после присоединения к нему GDB, вы можете использовать команду continue.
Если вы выйдете из GDB или используете команду run, пока у вас есть присоединенный процесс, вы убьете этот процесс. По умолчанию, GDB запрашивает подтверждение, если вы пытаетесь сделать одну из этих вещей; вы можете контролировать, нужно вам это подтверждение или нет, используя команду set confirm (see section Необязательные предупреждения и сообщения).
В некоторых операционных системах, программа не может быть выполнена вне GDB, пока у вас есть в ней точки останова, установленные отладчиком. В этой ситуации вы можете использовать команду kill, чтобы разрешить выполнение вашей программы вне отладчика.
Команда kill также полезна, если вы хотите перекомпилировать и перекомпоновать вашу программу, так как во многих системах невозможно модифицировать исполняемый файл во время выполнения процесса. В этом случае, когда вы в следующий раз введете run, GDB заметит, что файл изменился, и заново прочитает символьную таблицу (стараясь при этом сохранить ваши точки останова).
GDB предоставляет следующие возможности для отладки многонитевых программ:
Предупреждение: Эти возможности доступны еще не в любой конфигурации GDB, где операционная система поддерживает нити. Если ваш GDB не поддерживает нити, эти команды не имеют эффекта. Например, в системах без поддержки нитей, GDB ничего не выводит на команду `info threads', и всегда отвергает команду thread, как в этом примере:
(gdb) info threads (gdb) thread 1 Thread ID 1 not known. Use the "info threads" command to see the IDs of currently known threads.
Когда GDB обнаруживает новую нить в вашей программе, он выводит для нее идентификатор на целевой системе с сообщением в форме `[New сист-тег]'. Сист-тег является идентификатором нити, чья форма различается в зависимости от конкретной системы. Например, в LynxOS вы можете увидеть
[New process 35 thread 27]
Для отладочных целей, GDB присваивает свои собственные номера нитей---всегда в виде одного целого числа---каждой нити в вашей программе.
(gdb) info threads 3 process 35 thread 27 0x34e5 in sigpause () 2 process 35 thread 23 0x34e5 in sigpause () * 1 process 35 thread 13 main (argc=1, argv=0x7ffffff8) at threadtest.c:68
В системах HP-UX:
Для отладочных целей, GDB присваивает свои собственные номера нитей---небольшие целые, присваиваемые в порядке создания нитей--- каждой нити в вашей программе.
Когда GDB обнаруживает новую нить в вашей программе, он выводит как номер нити, присвоенный GDB, так и идентификатор на целевой системе для нити с сообщением в форме `[New сист-тег]'. сист-тег является идентификатором нити, чья форма различается в зависимости от конкретной системы. Например, в HP-UX, когда GDB замечает новую нить, вы увидите
[New thread 2 (system thread 26594)]
(gdb) info threads * 3 system thread 26607 worker (wptr=0x7b09c318 "@") \<BR> at quicksort.c:137 2 system thread 26606 0x7b0030d8 in __ksleep () \<BR> from /usr/lib/libc.2 1 system thread 27905 0x7b003498 in _brk () \<BR> from /usr/lib/libc.2
(gdb) thread 2 [Switching to process 35 thread 23] 0x34e5 in sigpause ()
Когда GDB останавливает вашу программу, вследствие точки останова или по сигналу, он автоматически выбирает нить, в которой появилась точка останова или сигнал. GDB предупреждает вас о переключении контекста сообщением в форме `[Switching to сист-тег]' для идентификации нити.
See section Остановка и запуск многонитевых программ, для дополнительной информации о поведении GDB, когда вы останавливаете и запускаете многонитевую программу.
See section Установка точек наблюдения, для информации о точках наблюдения в многонитевых программах.
Однако, если вы хотите отладить дочерний процесс, существует достаточно простое решение. Поместите вызов sleep в код программы, который дочерний процесс выполнит после fork. Может быть удобным вызывать sleep только если установлена определенная переменная среды или если существует определенный файл, так что задержка не будет происходить, если вы не захотите отлаживать дочерний процесс. Пока дочерний процесс спит, используйте программу ps для получения ее идентификатора процесса. Затем укажите GDB (новому экземпляру GDB, если вы отлаживаете также и родительский процесс) присоединиться к дочернему процессу (see section Отладка запущенного ранее процесса). Начиная с этого момента, вы можете отлаживать дочерний процесс точно также, как любой другой процесс, к которому вы присоединились.
В системе HP-UX (только в версиях 11.x и более поздних?) GDB предоставляет средства для отладки программ, которые создают дополнительные процессы, используя функции fork или vfork.
По умолчанию, когда программа ветвится, GDB будет продолжать отладку родительского процесса, а дочерний процесс будет выполняться беспрепятственно.
Если вы хотите отлаживать дочерний процесс вместо родительского, используйте команду set follow-fork-mode.
Когда дочерний процесс порождается вызовом vfork, вы не можете отлаживать дочерний или родительский процесс до тех пор, пока не завершится вызов exec.
Если вы даете GDB команду run после выполнения exec, новая программа стартует заново. Чтобы перезапустить родительский процесс, используйте команду file с именем выполняемого файла родительской программы в качестве аргумента.
Вы можете использовать команду catch, чтобы остановить GDB, когда сделан вызов fork, vfork или exec. See section Установка точек перехвата.