В данной главе обсуждается, как получить доступ к исходному коду из DDD.
Чтобы эффективно отлаживать программу, вам необходимо сгенерировать при компиляции отладочную информацию. Эта отладочная информация записывается в объектном файле; она описывает тип данных каждой переменной или функции и соответствие между номерами строк в исходном тексте и адресами в исполняемом файле.(9)
Чтобы затребовать создание отладочной информации, укажите при запуске
компилятора ключ -g
.
Многие компиляторы Си не могут одновременно обрабатывать ключи
-g
и -O
. При использовании таких компиляторов вы не
сможете генерировать оптимизированные исполняемые файлы с отладочной
информацией.
@acronym{GCC}, компилятор Си GNU, поддерживает ключ -g
с
-O
и без, что позволяет отлаживать оптимизированный код. Мы
рекомендуем всегда использовать ключ -g
при компиляции
программы. Вы можете считать, что ваша программа корректна, но нет
смысла испытывать удачу.
Когда вы отлаживаете программу, скомпилированную с -g -O
,
помните, что оптимизатор переорганизует ваш код; отладчик показывает то,
что есть на самом деле. Не удивляйтесь, когда поток выполнения не
совсем соответствует исходному файлу! Пример крайнего случая: если вы
определяете переменную, но нигде ее не используете, DDD не увидит эту
переменную -- потому что компилятор ее выбросил.
Если вы запустили DDD, не указав отлаживаемую программу, вы можете использовать меню `File' для открывания программ, дампов памяти и исходных файлов.
Чтобы открыть программу для отладки, выберите `File => Open Program'.(10) Чтобы открыть программу, щелкните на `Open'.
Если вы отлаживаете в JDB, выберите `File => Open Class'. Вы получите список доступных классов.
Чтобы открыть программу или класс, которые вы уже недавно отлаживали, выберите `File => Open Recent' и укажите программу или класс из списка.
См. раздел 4.3.4 Указание каталогов с исходными файлами, как задать каталоги исходных файлов, если исходные файлы не найдены.
Если предыдущий прогон программы завершился крахом, и вы хотите выяснить почему, вы можете исследовать в DDD дамп памяти этой программы.(11)
Чтобы открыть дамп памяти программы, выберите `File => Open Core Dump'. Для открывания дампа щелкните на `Open'.
Перед использованием `Open Core Dump' вы должны сначала выбрать `File => Open Program' и указать программу, которая сбросила дамп, и загрузить ее таблицу символов.
Чтобы открыть исходный файл отлаживаемой программы, выберите `File => Open Source'.
Чтобы открыть исходный файл, щелкните на `Open'. См. раздел 4.3.4 Указание каталогов с исходными файлами, если исходные файлы не найдены.
Когда DDD предоставляет список файлов для выбора, при открывании исполняемых файлов, дампов памяти или исходных файлов он по умолчанию фильтрует файлы, так что показываются только подходящие. Для этого DDD должен открывать каждый файл, что может занять некоторое время. См. раздел 4.4.6 Настройка фильтрации файлов, если вы хотите выключить эту возможность.
Когда исходный файл отлаживаемой программы становится доступен, в окне исходного кода показывается его текущий текст. (см. раздел 4.3.4 Указание каталогов с исходными файлами, если исходный текст не найден.)
В этом окне вы можете искать и исследовать определения функций и переменных, а также искать появления произвольного текста.
Если вы хотите найти определение какой-то конкретной функции или переменной, чье имя видимо в исходном тексте, щелкните на имени этой функции или переменной первой кнопкой мыши. Имя скопируется в поле аргумента. Измените его, если необходимо, и щелкните на кнопке `Lookup', чтобы найти определение.
Есть более быстрый способ: вы можете просто нажать на имени функции третью кнопку мыши и выбрать во всплывающем меню пункт `Lookup'.
Другой способ, еще быстрее: чтобы найти определение функции, дважды щелкните на ее вызове (это идентификатор, после которого стоит знак `(').
Если исходный файл не найден, См. раздел 4.3.4 Указание каталогов с исходными файлами, о том, как указать каталоги с исходными файлами.
Если объект, который вы хотите найти, виден в исходном тексте, щелкните на нем первой кнопкой мыши. Идентификатор будет скопирован в поле аргумента. Потом щелкните на кнопке `Find >>', чтобы найти следующие появления, или `Find >> => Find << ()', чтобы найти предыдущие появления.
По умолчанию DDD находит только полные слова. Для поиска произвольной подстроки измените значение параметра `Source => Find Words Only'.
Чтобы вернуться к начальной позиции после поиска, используйте `Edit => Undo' (или кнопку `Undo' в панели команд). `Edit => Redo' возвращает снова к найденной позиции.
Иногда в исполняемых программах не записываются каталоги исходных файлов, использовавшихся для компиляции, а записаны только имена файлов. Даже когда каталоги записаны, со времени компиляции их могли переместить.
Ниже описан способ, который применяется в GDB для обращения к исходным файлам; другие подчиненные отладчики пользуются сходными методами.
В GDB есть список каталогов, которые следует просматривать при поиске исходных файлов; он называется путем исходных файлов. Каждый раз, когда GDB нужен исходный файл, он пробует все каталоги из этого списка, в том порядке, в котором они в нем записаны, пока не найдет нужное имя. Заметьте, что путь исполняемых файлов не используется для этой цели. Не используется и текущий рабочий каталог, если только он не окажется в пути исходных файлов.
Если GDB не может найти файл по пути исходных файлов, а в объектной программе записан каталог, тогда GDB пробует его. Если путь исходных файлов пуст, а каталог компиляции не записан, GDB напоследок ищет в текущем каталоге.
Чтобы указать подчиненному отладчику путь исходных файлов, используйте `Edit => Debugger Settings' (см. раздел 3.6.5 Установки отладчика) и отредактируйте соответствующие поля (для GDB это `Search path for source files').
Если в `Debugger Settings' нет подходящего вхождения, вы можете задать путь исходных файлов при запуске DDD. См. раздел 2.1.4 Ключи подчиненного отладчика, для получения подробностей.
При использовании JDB вы можете установить переменную среды
CLASSPATH
для указания каталогов, где JDB (и DDD) должны
искать классы.
Если DDD по какой-либо причине не находит исходный файл, проверьте такие варианты:
-g
. См. раздел 4.1 Компиляция для отладки, для получения подробностей.
directory путь
.
Здесь путь -- это разделенный двоеточиями список исходных
каталогов.
Окно исходного кода можно по-разному настраивать, в основном через `Edit => Preferences => Source'.
Текущая выполняемая позиция и точки останова отмечаются в исходном тексте графическими символами (глифами). В качестве альтернативы, DDD может показывать такие позиции с помощью текстовых знаков. Если вы хотите выключить глифы, установите параметр `Edit => Preferences => Source => Show Position and Breakpoints => as Text Characters'. Это также слегка ускоряет работу DDD, особенно прокрутку.
Эта установка связана со следующим ресурсом:
--glyphs
и --no-glyphs
.
Вы можете более детально контролировать отображение глифов с помощью таких ресурсов:
10
.
10
).
Повышение этой величины приводит к резервированию большего числа глифов
и, возможно, бессмысленной трате ресурсов.
Поиск в исходном тексте (см. раздел 4.3.2 Текстуальный поиск) управляется посредством следующих ресурсов, которые можно изменить через меню `Source':
DDD может показывать в окне исходного кода номера строк. Используйте `Edit => Preferences => Source => Display Source Line Numbers'.
Вы можете велеть DDD делать в исходном коде отступы, оставляя больше
места для точек останова и глифов выполнения. Это делается с помощью
ползунка `Edit => Preferences => Source =>
Source indentation'. По умолчанию принимается значение 0
, то
есть отступы вообще не делаются.
0
.
По умолчанию DDD использует минимальный отступ для языков сценариев.
4
.
Максимальная ширина номеров строк контролируется следующим ресурсом.
4
.
Если в вашем исходном коде ширина знаков табуляции отличается от восьми (как по умолчанию), вы можете установить другую ширину, используя ползунок `Edit => Preferences => Source => Tab width'.
8
)
Следующие ресурсы говорят, когда прокручивается окно исходного кода:
2
.
3
.
Некоторые варианты DBX и XDB неправильно обрабатывают пути в спецификациях исходных файлов. Если вы хотите, чтобы подчиненный отладчик ссылался на исходные позиции только по базовым именам файлов, снимите установку `Edit => Preferences => Source => Refer to Program Sources by full path name'.
С этим связан следующий ресурс:
По умолчанию DDD кеширует исходные файлы в памяти. Это удобно для удаленной отладки, поскольку удаленный доступ к файлам может быть медленным. Если вы хотите уменьшить потребление памяти, снимите установку `Edit => Preferences => Source => Cache source files'.
С этим связан следующий ресурс:
Вы можете указать DDD, следует ли фильтровать файлы перед открыванием.