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


4. Навигация по исходному коду

В данной главе обсуждается, как получить доступ к исходному коду из DDD.

4.1 Компиляция для отладки

Чтобы эффективно отлаживать программу, вам необходимо сгенерировать при компиляции отладочную информацию. Эта отладочная информация записывается в объектном файле; она описывает тип данных каждой переменной или функции и соответствие между номерами строк в исходном тексте и адресами в исполняемом файле.(9)

Чтобы затребовать создание отладочной информации, укажите при запуске компилятора ключ -g.

Многие компиляторы Си не могут одновременно обрабатывать ключи -g и -O. При использовании таких компиляторов вы не сможете генерировать оптимизированные исполняемые файлы с отладочной информацией.

@acronym{GCC}, компилятор Си GNU, поддерживает ключ -g с -O и без, что позволяет отлаживать оптимизированный код. Мы рекомендуем всегда использовать ключ -g при компиляции программы. Вы можете считать, что ваша программа корректна, но нет смысла испытывать удачу.

Когда вы отлаживаете программу, скомпилированную с -g -O, помните, что оптимизатор переорганизует ваш код; отладчик показывает то, что есть на самом деле. Не удивляйтесь, когда поток выполнения не совсем соответствует исходному файлу! Пример крайнего случая: если вы определяете переменную, но нигде ее не используете, DDD не увидит эту переменную -- потому что компилятор ее выбросил.

4.2 Открывание файлов

Если вы запустили DDD, не указав отлаживаемую программу, вы можете использовать меню `File' для открывания программ, дампов памяти и исходных файлов.

4.2.1 Открывание программ

Чтобы открыть программу для отладки, выберите `File => Open Program'.(10) Чтобы открыть программу, щелкните на `Open'.

Если вы отлаживаете в JDB, выберите `File => Open Class'. Вы получите список доступных классов.

PICS/ddd-open

Чтобы открыть программу или класс, которые вы уже недавно отлаживали, выберите `File => Open Recent' и укажите программу или класс из списка.

См. раздел 4.3.4 Указание каталогов с исходными файлами, как задать каталоги исходных файлов, если исходные файлы не найдены.

4.2.2 Открывание дампов памяти

Если предыдущий прогон программы завершился крахом, и вы хотите выяснить почему, вы можете исследовать в DDD дамп памяти этой программы.(11)

Чтобы открыть дамп памяти программы, выберите `File => Open Core Dump'. Для открывания дампа щелкните на `Open'.

Перед использованием `Open Core Dump' вы должны сначала выбрать `File => Open Program' и указать программу, которая сбросила дамп, и загрузить ее таблицу символов.

4.2.3 Открывание исходных файлов

Чтобы открыть исходный файл отлаживаемой программы, выберите `File => Open Source'.

Чтобы открыть исходный файл, щелкните на `Open'. См. раздел 4.3.4 Указание каталогов с исходными файлами, если исходные файлы не найдены.

4.2.4 Фильтрация файлов

Когда DDD предоставляет список файлов для выбора, при открывании исполняемых файлов, дампов памяти или исходных файлов он по умолчанию фильтрует файлы, так что показываются только подходящие. Для этого DDD должен открывать каждый файл, что может занять некоторое время. См. раздел 4.4.6 Настройка фильтрации файлов, если вы хотите выключить эту возможность.

4.3 Поиск объектов

Когда исходный файл отлаживаемой программы становится доступен, в окне исходного кода показывается его текущий текст. (см. раздел 4.3.4 Указание каталогов с исходными файлами, если исходный текст не найден.)

В этом окне вы можете искать и исследовать определения функций и переменных, а также искать появления произвольного текста.

4.3.1 Поиск определений

Если вы хотите найти определение какой-то конкретной функции или переменной, чье имя видимо в исходном тексте, щелкните на имени этой функции или переменной первой кнопкой мыши. Имя скопируется в поле аргумента. Измените его, если необходимо, и щелкните на кнопке `Lookup', чтобы найти определение.

PICS/ddd-source-popup

Есть более быстрый способ: вы можете просто нажать на имени функции третью кнопку мыши и выбрать во всплывающем меню пункт `Lookup'.

Другой способ, еще быстрее: чтобы найти определение функции, дважды щелкните на ее вызове (это идентификатор, после которого стоит знак `(').

Если исходный файл не найден, См. раздел 4.3.4 Указание каталогов с исходными файлами, о том, как указать каталоги с исходными файлами.

4.3.2 Текстуальный поиск

Если объект, который вы хотите найти, виден в исходном тексте, щелкните на нем первой кнопкой мыши. Идентификатор будет скопирован в поле аргумента. Потом щелкните на кнопке `Find >>', чтобы найти следующие появления, или `Find >> => Find << ()', чтобы найти предыдущие появления.

По умолчанию DDD находит только полные слова. Для поиска произвольной подстроки измените значение параметра `Source => Find Words Only'.

4.3.3 Поиск предыдущих позиций

Чтобы вернуться к начальной позиции после поиска, используйте `Edit => Undo' (или кнопку `Undo' в панели команд). `Edit => Redo' возвращает снова к найденной позиции.

PICS/ddd-source

4.3.4 Указание каталогов с исходными файлами

Иногда в исполняемых программах не записываются каталоги исходных файлов, использовавшихся для компиляции, а записаны только имена файлов. Даже когда каталоги записаны, со времени компиляции их могли переместить.

Ниже описан способ, который применяется в 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 по какой-либо причине не находит исходный файл, проверьте такие варианты:

4.4 Настройка окна исходного кода

Окно исходного кода можно по-разному настраивать, в основном через `Edit => Preferences => Source'.

PICS/ddd-source-prefs

4.4.1 Настройка глифов

Текущая выполняемая позиция и точки останова отмечаются в исходном тексте графическими символами (глифами). В качестве альтернативы, DDD может показывать такие позиции с помощью текстовых знаков. Если вы хотите выключить глифы, установите параметр `Edit => Preferences => Source => Show Position and Breakpoints => as Text Characters'. Это также слегка ускоряет работу DDD, особенно прокрутку.

Эта установка связана со следующим ресурсом:

Ресурс: displayGlyphs (класс DisplayGlyphs)
Если это `on', текущая выполняемая позиция и точки останова отмечаются глифами; иначе, они показываются с помощью знаков в тексте. По умолчанию принимается `on'. См. раздел 2.1.2 Ключи DDD, о ключах --glyphs и --no-glyphs.

Вы можете более детально контролировать отображение глифов с помощью таких ресурсов:

Ресурс: cacheGlyphImages (класс CacheMachineCode)
Следует ли кешировать изображения глифов (`on') или нет (`off'). При кешировании глифов требуется меньше ресурсов X, но по сообщениям, это не работает с Motif 2.1 на серверах XFree86. По умолчанию это `off' для Motif 2.1 или более поздних на машинах с GNU/Linux и `on' в остальных случаях.

Ресурс: glyphUpdateDelay (класс GlyphUpdateDelay)
Задержка (в миллисекундах) перед обновлением глифов при прокрутке исходного текста. Когда это значение мало, глифы прокручиваются вместе с текстом, а если оно велико, глифы исчезают во время прокрутки. По умолчанию используется значение 10.

Ресурс: maxGlyphs (класс MaxGlyphs)
Максимальное число отображаемых глифов (по умолчанию 10). Повышение этой величины приводит к резервированию большего числа глифов и, возможно, бессмысленной трате ресурсов.

4.4.2 Настройка поиска

Поиск в исходном тексте (см. раздел 4.3.2 Текстуальный поиск) управляется посредством следующих ресурсов, которые можно изменить через меню `Source':

Ресурс: findCaseSensitive (класс FindCaseSensitive)
Если это `on' (по умолчанию), команды `Find' учитывают регистр букв. Иначе, регистр игнорируется.

Ресурс: findWordsOnly (класс FindWordsOnly)
Если это `on' (по умолчанию), команды `Find' находит только полные слова. Иначе, они находят любые появления искомой подстроки.

4.4.3 Настройка вида исходного текста

DDD может показывать в окне исходного кода номера строк. Используйте `Edit => Preferences => Source => Display Source Line Numbers'.

Ресурс: displayLineNumbers (класс DisplayLineNumbers)
Если это `on', перед каждой строкой исходного текста пишется ее номер. По умолчанию `off'.

Вы можете велеть DDD делать в исходном коде отступы, оставляя больше места для точек останова и глифов выполнения. Это делается с помощью ползунка `Edit => Preferences => Source => Source indentation'. По умолчанию принимается значение 0, то есть отступы вообще не делаются.

Ресурс: indentSource (класс Indent)
Число столбцов отступа в исходном коде, чтобы оставалось достаточно места для отображения позиций точек останова. По умолчанию 0.

По умолчанию DDD использует минимальный отступ для языков сценариев.

Ресурс: indentScript (класс Indent)
Минимальный отступ для языков сценариев, таких как Perl и Python. По умолчанию 4.

Максимальная ширина номеров строк контролируется следующим ресурсом.

Ресурс: lineNumberWidth (класс LineNumberWidth)
Число столбцов, использующихся для номеров строк (если они показываются). Номера строк, которые шире этой величины, заходят на поле глифов точек останова. По умолчанию 4.

Если в вашем исходном коде ширина знаков табуляции отличается от восьми (как по умолчанию), вы можете установить другую ширину, используя ползунок `Edit => Preferences => Source => Tab width'.

Ресурс: tabWidth (класс TabWidth)
Ширина знаков табуляции в окне исходного текста (по умолчанию 8)

4.4.4 Настройка прокрутки исходного текста

Следующие ресурсы говорят, когда прокручивается окно исходного кода:

Ресурс: linesAboveCursor (класс LinesAboveCursor)
Какое минимальное число строк перед текущей позицией следует показывать. По умолчанию это 2.

Ресурс: linesBelowCursor (класс LinesBelowCursor)
Какое минимальное число строк после текущей позиции следует показывать. По умолчанию 3.

4.4.5 Настройка поиска исходных файлов

Некоторые варианты DBX и XDB неправильно обрабатывают пути в спецификациях исходных файлов. Если вы хотите, чтобы подчиненный отладчик ссылался на исходные позиции только по базовым именам файлов, снимите установку `Edit => Preferences => Source => Refer to Program Sources by full path name'.

С этим связан следующий ресурс:

Ресурс: useSourcePath (класс UseSourcePath)
Если это `off', подчиненный отладчик ссылается на исходные позиции только по базовым именам файлов. Если это `on' (по умолчанию), DDD использует полные пути исходных файлов.

По умолчанию DDD кеширует исходные файлы в памяти. Это удобно для удаленной отладки, поскольку удаленный доступ к файлам может быть медленным. Если вы хотите уменьшить потребление памяти, снимите установку `Edit => Preferences => Source => Cache source files'.

С этим связан следующий ресурс:

Ресурс: cacheSourceFiles (класс CacheSourceFiles)
Кешировать исходные файлы (`on', по умолчанию) или нет (`off'). Для кеширования требуется больше памяти, но с ним DDD работает быстрее.

4.4.6 Настройка фильтрации файлов

Вы можете указать DDD, следует ли фильтровать файлы перед открыванием.

Ресурс: filterFiles (класс FilterFiles)
Если это `on' (по умолчанию), DDD фильтрует файлы при открывании выполняемых файлов, дампов памяти или исходных файлов, так что для выбора предоставляются только подходящие. Для этого DDD должен открывать каждый файл, что требует времени. Если это `off', DDD всегда предоставляет все доступные файлы.


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