DDD DATA DISPLAY DEBUGGER Отладчик с визуальным отображением данных
|
- Графический интерфейс,
многооконная система
- Просмотр исходного кода всей программы
- Традиционно: пошаговый проход по исходному коду программы
- Графическая
отметка точек прерывания и просмотра
- Сохранение точек останова после
перекомпиляции
- Изменение значений переменных во время выполнения программы
- Графическое отображение структуры данных.Отображения остаются до
его удаления и обновляются при каждом останове программы
- Автоматическое размещение и выравнивание диаграмм
- Автоматическое
переключение между несколькими файлами с исходным кодом
- Работа с различными
подчиненными отладчиками
- Автоматическое определение необходимого отладчика
- Совместная работа с Gnuplot демонстрирует данные, хранящиеся в массивах.
График обновляется при каждом останове программы
- При использовании GDB
или DBX - исследование содержимого памяти в нескольких форматах, независимо
от типов данных входной программы
- Поддержка различных языков программирования
- Возможность запускать DDD, подчиненный отладчик и отлаживаемую программу на разных машинах.
- DDD сам может выступать в роли подчиненного отладчика в других интерфейсах для отладчиков, комбинируя их возможности со своими
Авторы этого
чуда - изначально Andreas Zeller и Dorothea
Luetkenhaus и многие другие программисты из сообщества свободного
программного обеспечения. Все они упомянуты в файлах ChangeLog и THANKS
дистрибутива DDD. Год, место рождения продукта - 1990, дипломный проект
Андреаса Зеллера, создавшего VSL - визуальный язык структур для
отображения структур данных и программ и дипломная работа Доротеи Люткехаус в
1994 с реализацией DDD.
DDD распространяется свободно,
является частью проекта GNU GPL - General Public License
(Универсальная Общественная Лицензия).
Вызов
DDD может быть вызван и
просто по имени, и с добавлением необходимых ключей, если он сам, конечно присутствует в системе. В этом необходимо заранее убедиться.
Кроме того, что сам DDD
имеет свой немаленький набор ключей, он может пользоваться ключами своего
подчиненного отладчика, которых также великое множество, как это и бывает в
современных системах, и, конечно, DDD обязан понимать определенные ключи
XWindow, с которым он работает.
Вызов DDD
|
Иконка в дистрибутиве. Стандартное действие по вызову |
ddd |
Вызов
из командной строки без предварительных ключей |
Alt+F2/выполнение DDD |
В RedHat под KDE/GNOME. Использовать окно выполнения. В нем можно указать и ключи и параметры отладчика также, как и в командной строке
|
ddd
--help
ddd -h ddd -? |
Вывести список ключей DDD для определения
среды отладки до начала работы. Основные ключи - см. выбор
подчиненного отладчика и собственные ключи подчиненных. |
ddd --maintenance |
Включить меню Maintenance. Это дополнительная кнопка в полосе меню. По умолчанию меню выключено. Содержит операциии с дампом памяти и игру Tic Tac Toe - чтобы сделать партию в крестики/нолики, пока мысль зреет
|
ddd --debugger имя |
Вызвать подчиненный отладчик с
указанным именем, если не устраивает автоматический вызов |
ddd --debugger "xdb -d каталог |
Пример
вызова DDD с указанием ключа подчиненного отладчика |
ddd --tty |
DDD сам становится подчиненным, в другой интерфейсной программе (Emacs, например). DDD включает TTY интерфейс, принимая команды отладчика со стандартного ввода и пересылая вывод отладчика на стандартный вывод, как если бы подчиненный отладчик был вызван непосредственно |
ddd program |
заранее указать программу |
ddd program core |
для подчиненных GDB,
DBX, Ladebug или XDB указать при запуске исполняемую программу и файл с дампом
памяти |
ddd program 1234 |
для отладки
работающего процесса - второй аргумент - ID этого процесса. Если нет файла с
именем `1234' DDD будет искать файл с дампом памяти. |
Использование DDD с удаленным подчиненным
отладчиком |
ddd --host host_name ddd --host
name@host_name |
Запустить подчиненный отладчик на
удаленной машине host_name |
--rhost
host_name --rhost name@host_name |
Запустить подчиненный
отладчик в интерактивном режиме на удаленной машине host_name. Если
задано имя-пользователя, и не задан ключ --login, использовать его в качестве
имени удаленного пользователя name. |
Чтобы запустить DDD в качестве подчиненного отладчика в другой интерфейсной программе , нужно настроить ее так, чтобы вместо ее подчиненного отладчика работал бы `ddd --tty'. Чтобы интегрировать DDD с Emacs, следует набрать в Emacs:
M-x gdb или M-x dbx для запуска сеанса отладки.
В подсказке ввести
ddd --tty
далее:
--dbx или --gdb если нужно, и добавить имя отлаживаемой программы.
Ключи XWindow используются с одним
дефисом.
Ключи XWindow
-display дисплей | Использовать X-сервер
дисплей. По умолчанию дисплей берется из переменной среды DISPLAY |
-geometry геометрия |
Задает начальный размер и позицию консоли отладчика |
-iconic |
Запустить DDD в свернутом виде |
-name имя -title имя |
Дать DDD указанное имя и Дать окну DDD заголовок имя |
-selectionTimeout время |
Задает промежуток времени (в
миллисекундах), в течение которого два общающихся приложения должны ответить
друг другу на запрос о выделении |
-xrm строка-ресурса |
Задает имя ресурса и его значение, перекрывающее установку по
умолчанию |
Нет возможности перечислить все ключи
каждого из подчиненных - их достаточно много и кроме того, есть зависимость от
версии. Убедившись, что выбранный подчиненный, command_line отладчик присутствует в
системе, обратитесь к его man-странице или воспользуйтесь адресом документации,
указанным здесь в таблице. Основные ключи подчиненных отладчиков даны в самом руководстве по DDD.
Выбор подчиненного отладчика
Если сам DDD - графический интерфейс, graphical
front-end, то отладчики, с которыми он работает - это
command-line отладчики, действующие в командной строке. Они могут быть
названы и как backend, и как inferior - базовые или подчиненные,
поскольку работают на уровень ниже DDD. Обычно выбор подчиненного
отладчика определяется тем, какую программу нужно анализировать.
Подчиненные
отладчик |
платформа |
подключение |
комментарий |
Для отладки исполняемых двоичных
файлов C, C++,Паскаль, Ада, Модуль-2, Модуль-3, Фортран, Java,
Chill |
GDB |
GNU/Linux |
ddd --gdb program |
Рекомендуемый;
встает в пару к DDD по умолчанию, если не было сделано дополнительных настроек
|
DBX |
UNIX DEC AIX |
ddd --dbx program |
предоставляет
меньше возможностей, чем GDB, и не все поддерживаться в DDD. Но иногда
справляется там, где GDB не в силах. Проблемы с паскалеобразными программами в
индексации массивов - всегда считает с единицы. В DEC, AIX нет автоматического
отображения данных, только по команде "print". |
Ladebug |
DEC UNIX Linux системы |
ddd --ladebag
program |
альтернатива GDB и DBX со всеми его
ограничениями. Возможностей меньше, но может выручить, если другие отладчики не
справляются. Есть поддержка для COBOL |
XDB |
HP-UX |
ddd --xdb program |
Нет автоматического отображения данных - только по команде "p"; потерял
поддержку в поздних выпусках DDD |
WDB | |
ddd --wdb
program |
По существу - вариант GDB |
Для отладки программ, работающих с
интерпритатором |
JDB |
|
ddd --jdb program |
Java Нет автоматического отображения данных - используется команда
"dump" |
PYDB |
ddd --pydb program | Python |
PERL |
ddd --perl program |
Perl Нет
автоматического отображения данных - используется команда "x" |
Если вызов DDD идет без ключей, но имя самой
программы указано явно в командной строке или выбрано в графическом диалоге, то
подчиненный отладчик будет выбран автоматически, если, конечно он существует на
данной системе.
Использование удаленных ресурсов Все
компоненты набора из самого DDD, подчиненного отладчика и исследуемой программы
можно запускать
на разных машинах.
Удаленный запуск
Запуск DDD на удаленной машине, используя текущую
машину в качестве X-дисплея,к которому следует подсоединиться. Вместо ключа -display можно установить переменную
среды DISPLAY. |
ddd -display дисплей |
дисплей - имя
X-сервера, например: your_host_name:0.0 |
Использование DDD с удаленным подчиненным отладчиком |
ddd --host host_name remote_pgm |
host_name - удаленная машина remote_pgm - удаленная
программа |
ddd --host host_name --login имя-пользователя remote_pgm
ddd --host имя-пользователя@host_name remote_pgm |
Если удаленное имя пользователя отличается от локального
|
Для счастливых обладателей Windows 9x/NT/2K/XP/..- придется
подгрузить какой-то эмулятор Х-Window, позволяющий запускать приложения других систем, в часности, из систем UNIX и Linux. Здесь выбор большой: Exceed, WinaXe, X-Win32, Reflection...; можно поставить Cygwin - это до 2Gb(но не лучше ли
сразу - Linux?)
Выход из DDD
Перед выходом из
текущего сеанса есть возможность сохранить состояние отладчика, чтобы продолжить
работу позже. Для этого, выбрав `File => Save Session As', и назначив в
диалоге символьное имя для сеанса, можно просто закрыть последнее окно DDD. Но
возможны и варианты:
Выход из DDD
`File => Exit' | Выбрать в верхнем меню главного окна
DDD |
quit |
Набрать команду в подсказке
отладчика |
q Ctrl+Q Ctrl+D | c
GDB и XDB можно и так выйти |
Ctrl+C kill |
В случае, если DDD завис - прервать по SIGINT, или командой
UNIX/Linux |
Если вызов DDD идет без ключей, но имя самой программы указано явно в
командной строке или выбрано в графическом диалоге, то подчиненный отладчик
будет выбран автоматически, если, конечно, он существует на данной системе.
Если очень коротко - необходимые ресурсы, которые нужно иметь для работы с отладчиком:
X-сервер
собственно сам графический отладчик DDD
подчиненный отладчик
программа
И все эти три последние компоненты могут быть разбросаны по разным машинам, учитывая, что подчиненный отладчик позволяет запускать отлаживаемую программу на удаленной машине
(называемой удаленной целью), тогда как сам работает на локальной машине. Но X-сервер - Ваш собственный.
Примеры сеансов
Визуализация структур, деревьев
Небольшая
программа node на C продемонстрирует некоторые возможности
отладчика.
Программа занимается древовидной сортировкой. Определяется структура
node, ссылающаяся сама на себя. Функция new
возвращает указатель на вновь созданную вершину дерева, содержащую целочисленное
значение, передаваемое в качестве параметра. Переменной newval
присваивается значение вершины, созданной последней. Определяется функция
print для печати дерева. Функция split вставляет
новую вершину в упорядоченное дерево с заданным корнем так, чтобы недавно
вставленные вершины находились вблизи от корня дерева.
Чтобы воспользоваться услугами DDD, необходимо при компиляции создать
отладочную информацию и включить ее в объектный код программы. Без отладочной информации подчиненный отладчик не сможет найти исходный код. Для этого используется ключ
-g при вызове компилятора GNU C:
gcc -g node.c -o node
Размер созданного исполняемого файла, получится чуть
большe. Запускается файл обычным образом, но работь будет медленнее.
Теперь можно запустить отладчик. Если есть желание это сделать из командной
строки, то лучше указать фоновый режим:
ddd&
Можно просто кликнуть по иконке отладчика. DDD
поприветствует Вас советом дня. Его стоит читать.
Следующим раскрывается главное окно, но пустое - имя программы не было указано.Рисунок 1 демонстрирует отладчик в процессе работы, в каждом окне представлена своя информация о происходящем.
Рисунок 1: Главное окно DDD
|
Полоса меню. Все открытые меню можно отделять по пунктирным
линиям и разбрасывать по рабочему столу.
| Панель инструментов c полем аргументов. Кнопки активизируютя только когда они
полезны.
| Окно данных. Здесь в компактной графике появляются исследуемые
объекты.
| Окно исходного кода.
| Окно машинного кода - встает не по умолчанию. Здесь оно только
для наглядности.
| Консоль отладчика.
| Строка состояния, и справа - зеленый индикатор занятости -
подчиненный к работе готов!
| Панель команд появляется как отдельное окно на фоне основного.
|
Окон и кнопочек в отладчике много и что самое приятное - в большинстве своем их
назначения интуитивно понятны.
Настройки интерфейса.
Размер всех окон можно менять и даже разъединить их выбрав:
Edit => Preferences => Startup => Window Layout => Separate Windows
Существует возможность добавлять кнопки в консоли, исходнике, в окне данных с
помощью редактора кнопок:
Commands => Edit Buttons
Редактор кнопок показывает текст, где каждая строка содержит команду для одной
кнопки. Щелчок на OK' создает соответствующие этому тексту кнопки. Если текст пуст (по умолчанию), кнопки не создаются.
Чтобы в текстах
программ была возможность читать комментарии
на родном языке, желательно настроить в KOI8-r равноширинный шрифт, который
используется для исходного кода:
Edit => Preferences => Fonts => Fixed Width => Brows => enccdng == r
Edit => Preferences => Fonts => Fixed Width => Brows => rgstry == koi8
И небольшое замечание: компания Red Hat, начиная с восьмой версии своего
дистрибутива, сделала в системе стандартом универсальную кодировку UTF8, что
приводит к некоторому неудобству при работе с отладчиком.
Кроме того, в данном сеансе были сделаны следующие установки:
Edit => Preferences => Startup
Flat - рамка кнопок панели инструментов будет появляться только тогда, когда над ними находится указатель мыши.
Color - рисунки панели инструментов будут расцвечиваться, когда на них заходит указатель мыши.
Выбрать/изменить/приукрасить графику в окне данных:
Edit => Preferences => Data
Grid Size -> 10
Themes -> Green Background + Small Values
Загрузка программы Найти в полосе меню:
File => Open Program
Открывшееся окно предложет выбрать программу. Несколько утвердительных
кликов мышью и
исходный код появится в основном окне. Для открытия недавно отлаживаемых файлов:
File => Open Recent
В окне исходного кода проставить номера строк:
Edit => Preferences => Source => Display Source Line Numbers
Отладчик вызван, программа загружена. DDD ждет Ваших распоряжений.
Точки прерывания
Прежде чем запустить программу, необходимо выбрать и расставить точки прерывания. В
node ее можно поставить в главной подпрограмме до начала
выполнения оператора print, чтобы не дать программе преждевременно
завершиться. Для этого - подвести курсор к началу строки, кликнуть правой
кнопкой и задержать ее. Появится еще одно меню. Выбрать Set BreakPoint.
Результат - см на Рисунке 1.
Есть возможность раскидать точки останова, используя регулярное выражение в ():
Break => Set Breakpoints at Regexp ()
Или поставить временную точку:
Set Temporary Breakpoint
Continue Until Here из всплывающего меню также устанавливает временную точку останова слева от исходной строки. Программа останавливается, когда достигнута эта точка и точка удаляется.
Пункты Set Temporary Breakpoint и Continue Until Here доступны также по кнопке Break. Чтобы вызвать всплывающее меню, нажмите и удерживайте на этой кнопке левую кнопку мыши.
У точек останова есть свойства. И их можно менять, нажав на ее символе
третью кнопку мыши и выбрав из всплывающего меню пункт Properties. И
опять окно DDD: Properties: Breakpoint 1
Можно заставить программу останавливаться, когда изменяется значение
какой-нибудь переменной: ввести имя переменной в поле аргумента и нажать кнопку
Watch.
Активизация программы
И здесь возможны варианты. Если воспользоваться кнопкой Run на панели
команд - это то окно, которое выскакивает вместе с главным - то программа
node не получит своих данных и завершится при первом проходе с
результатом 1.
Есть еще один сособ запуска, удобный тем, что сразу можно ввести аргументы. В
полосе меню найти и открыть:
Program => Run
Получаем новое окно Run Program, состоящее из двух частей:
Arguments -предлагается выбрать из списка ранее использовавшиеся
аргументы
Run with Arguments - ввести новые в текстовом поле через пробел. В нижнем поле для программы node введем, например :
12 99 6 3 -2 8
Теперь можно и -
Run
Не стоит забывать, что такое окно существует и для повторного запуска программы
с теми же аргументами. Используйте:
Program => Run Again
или нажмите кнопку Run на панели команд. Или можно ввести run и
затем аргументы в подсказке отладчика.
Итак, еще раз, по шагам:
Пишется программа
Успешно компилируется с необходимым ключом -g
Вызывается DDD
File => Open Program
Ставится точка останова
Run
Интерактивный режим
Начинается работа программиста
Зеленая стрелка в окне с исходным кодом на Рисунке 1 указывает на строку, которая будет
выполнена следующей. Способ передвижения по исходному коду:
next - шагать по строкам, но через тело вызываемых процедур
nexti - пройти одну инструкцию, обходя вызовы
step - идти последовательно по всем строкам программы, входя в функции
stepi - пройти одну инструкцию входя в вызовы
until - продолжить до следующей строки
continue - продолжить, например, до следующей точки останова
Interrupt - прервать отлаживаемую программу
kill - уничтожить процесс программы
- выбирается на панели команд с учетом, что одна строка исходного кода может содержать несколько инструкций
Используя next - кнопка next на панели команд - идем по коду. Можно избежать многократное нажатие на кнопку навигации по программе, использовав
возможность игнорировать несколько раз точку прерывания, или задать ей булевое условие. Это уже из области редактирования свойств точек останова. На символе точки в окне с исходным кодом нажать правую кнопку мыши. Выбрать из всплывающего меню пункт Properties, немного поработать с диалоговым окном и подтолкнуть програму еще раз.
Пока программа в работе, можно отслеживать значения простых
переменных:
- - подвести и задержать курсор над именем переменной.
- Результат - в
желтой подсказке.
- - нажать правой клавишей мыши над идентификатором , выбрать пункт меню
Print .
- Результат в консоли.
- - пометить идентификатор и выбрать пункт меню Data => Print().
- Результат
в консоли.
Наведем курсор на root - в появившейся желтой подсказке появится
16-ричное значение этого указателя на структуру типа struct nodept.
Таким же способом можно узнать информацию о любой переменной, если она доступна в данный момент.
Во время пошаговой работы программы, в нижнем окне - консоли - выводится дополнительная информация от подчиненного отладчика. Например, кроме всех введенных команд, там можно наблюдать изменение значения переменной argc - количества уже отсортированных данных.
Рисунок 2: Структуры
| Следующий шаг. Кликнем правой клавишей мыши над тем же именем указателя. В
появившемся меню выберем Display Start*. DDD автоматически
разыменует указатель и покажет в окне данных содержащиеся в структуре данные. Если значение поля left или right отлично от нуля, то это поле указывает на другую структуру. Если дважды щелкнуть на этом поле, появится новая рамка с содержимым другой структуры с указателем в виде стрелки.
Через несколько шагов получим что-то похожее на Рисунок 2:
|
По умолчанию DDD не распознает разделяемые структуры данных т.е. объект, на который ссылаются несколько других объектов. Например, если два указателя ссылаются на один и тот же объект , отображения будут различными, хотя они и обозначают один и тот же объект. |
Рисунок 3: Использование Detect Aliases
|
Т.к. в данном сеансе оказалось, что рамка со структурой продублировалась, т.е. структура
отобразилась более одного раза, придется воспользоваться специальным режимом детектирования псевдонимов,
alias detection, чтобы убрать лишнее:
Data => Detect Aliases
В результате получаем Рисунок 3. Пока такие вещи возможны только при
использовании языков C, C++ и Java |
Рисунок 4: Использование Layout Graph
|
Если вспомнить, что программа node должна сортировать то что ей
предложено в самом начале, то хорошо бы это дерево и увидеть в окне, а не кучу
структур. Такая возможность существует:
Data => Layout Graph
И кроме того, изображенное отладчиком дерево можно повернуть в удобном для просмотра направлении.
На самом деле, отладчик допускает перетаскивание рамок с данными в пределах окна
данных вручную - мышкой. Так что всегда рисунок можно подправить. |
Редактирование и перекомпиляция
Не предоставляется возможности изменять текущий отображаемый файл в самом DDD, но при необходимости DDD откроет текстовый редактор. Для этой цели либо используется кнопка Edit, либо выбор:
Source => Edit Source
Указать отладчику Ваш любимый текстовый редактор:
Edit => Preferences => Helpers => Edit Sources
После выхода из редактора отображение исходного кода автоматически обновляется, точки останова сохраняются.
Для перекомпиляции исходного кода с помощью make выбрать:
File => Make
Всплывет диалоговое окно, где вводится цель Make - как правило, это имя исполняемого файла. Щелчок на кнопке Make вызывает программу make с указанной целью.
Кнопка Make на панели команд повторно вызывает make с последними использованными аргументами.
И еще одно замечание: функции из cтандартныех библиотек C не содержат отладочной информации. Их можно обходить командой next. К примеру, если продвигаться по команде step и зайти в такую функцию, отладчик выдаст сообщение о недостатке
исходных файлов. Чтобы пошагово пройти такие функции, используйте команду stepi.
Построение графиков массивов
И это он может сделать. Точнее - позволит сделать и поможет. Сам DDD графики не строит. Это поручается внешней программе Gnuplot, с которой отладчик интегрируется.
DDD обрабатывает данные в массиве, обращается к Gnuplot, если Вы того пожелаете, и добавляет к окну графика Gnuplot свою полоску меню, которая позволяет изменять внешний вид картинки.
DDD строит графики двух типов числовых значений:
Одномерные массивы изображаются в двумерном пространстве
Двумерные массивы изображаются в трехмерном пространстве
Для демонстрации этих возможностей заполним два массива значениями функций:
f(x) = xe-x²
| заполнит статический одномерный массив sarr
|
f(x,y) = xe(-x²-y²)
| создаст динамический двумерный массив mass
|
Это сделает программа graphd.c:
Последовательность действий - та же, что и в предыдущем примере:
- компиляция программы graphd.c с ключами -g для создания отладочной информации и -lm для подключения математической библиотеки:
gcc -g -lm -o graph graph.c
| - вызов отладчика
| - загрузка программы
| - установка точек прерывания
| - запуск программы
|
В первой части своей работы программа заполняет одномерный массив sarr. Чтобы построить график массива фиксированного размера, достаточно выделить его имя щелчком левой клавиши. Имя массива появится в поле аргумента. Далее - найти и щелкнуть в полосе меню кнопку Plot. Появится новое окно с графиком функции f(x) как на Рисунке 5. В окне данных можно одновременно просматривать числовые значения аргумента функции в виде таблицы. График и таблица обновляются автоматически во время изменения или по мере заполнения массива sarr.
Рисунок 5: f(x) = xe-x²
|
Рисунок 6: f(x,y) = xe(-x² - y²)
|
Во второй части программы создается динамический массив значений двумерной функции f(x,y). Для исследования динамического массива последовательность действий должна быть иная.
DDD не в состоянии автоматически определить размер динамически создаваемых массивов и если просто отщелкнуть имя динамического массива, DDD откликнется лишь напоминанием Nothing to display - нет данных для отображения. Есть плохой выход - заполнять статический двумерный массив и иметь проблемы с памятью. Но лучше использовать способность GDB отображать последовательные объекты в непрерывной области памяти. Ссылаться на непрерывную область памяти можно с помощью бинарного оператора @ подчиненного отладчика GDB . Для данной программы в консоли отладчика набрать команду:
graph display mass[0][0]@count@count2
Что означает: взять первый элемент желаемого массива и указать желаемую длину массива.
Далее отладчик будет действовать исходя из типа первого аргумента. Т.о. делается срез массива, с нижней и верхней границей. Вместо count и count2 можно указать численные значения. В результате этой команды в окне данных появится таблица значений исследуемой функции с индексами x и y.
График трехмерной функции строится также по срезу массива. Запись команды для построения графика трехмерной функции:
graph plot mass[0][0]@count@count2
Результат должен получиться похожим на Рисунок 6.
Каждый раз, когда во время выполнения программы значение изменяется, график обновляется по текущим значениям. Окно графика остается активным до тех пор, пока оно не будет закрыто (File => Close), или пока не будет удалено соответствующее ему отображение. При просмотре трехмерного графика можно менять точку наблюдения с помощью полосок прокрутки. Горизонтальная полоска прокрутки поворачивает график вправо или влево. Вертикальная полоска прокрутки поворачивает вверх или вниз.
При каждом останове программы DDD записывает значения всех отображаемых переменных, чтобы была возможность отменить выполнение программы. Для таких историй отображений тоже можно построить график. Пункт меню
Plot => Plot history of ()
создает график, в котором показаны все записанные ранее значения выделенного отображения.
Чтобы освободить себя от тяжелой работы прописывания в консоли таких длинных команд, как в последнем сеансе, полезно знать, что можно пользоваться Command History, историей команд:
Commands => Command History
Или использовать стрелки Up и Down, чтобы повторить предыдущие и последующие команды соответственно.
Работа с Fortran, Pascal - программами
Тут могут быть проблемы. Рассмотренные отладчики ориентированны все-таки на языки C и C++, как традиционные языки разработки систем. Отладчик не может понять отдельные специфические моменты в языках программирования, если для них нет аналогов в C и C++ .
DDD прекрасно определяет язык программирования в программе, с которой к нему пришли, но в фортран-программе, например, при компиляции с опцией -g не создается отладочной информации для переменных COMMON блока и EQUIVALENCE. К сожалению, не появится желтая подсказка в окне с исходным кодом и команда в консоли (gdb): display ... Вам не поможет. Тем не менее, есть возможность обратиться к памяти, выделенной для COMMON и EQUIVALENCE. Что касается версии 0.5.19 компилятора g77, предлагаются опции -fdebug -kludge для создания информации о памяти этих областей для отладки. В поздних версиях g77 эти опции уже не сработают и компилятор попросит использовать опцию -g.
Решение проблемы: воспользоваться командой подчиненного отладчика GDB в консоли DDD:
(gdb)set lang c
переход к синтаксису языка C
Учитывая, что для COMMON блока с именем name g77 генерирует массив
символов с именем name_ и с COMMON блоком ассоциируется непрерывный
участок памяти, следует использовать указатели на данные в смысле языка C. Так как в C первый элемент массива имеет индекс 0,
придется вручную вычислить сдвиг, offset в массиве символов, чтобы рассматривать массив как массив байтов. И далее взять адрес необходимого байта, перевести к типу указателя на требуемый тип. Подробнее об этих действиях - в статье
Pavel Khaustov .
Отладка программ, написанных на Free Pascal также вынуждает учитывать отличие его от языка C. Перечисление проблем и их решения - см. в статье Ильи Аввакумова
Полезные ссылки, документы
Отладка вдвое сложнее, чем написание соответствующего кода.
Поэтому, если Вы напишете код настолько умно и хитро, насколько
возможно, Вам по определению не хватит сообразительности, чтобы его отладить.
Брайан Керниган (Brian W. Kernighan)
Н.И.К. |