этого
чуда - изначально Andreas Zeller и Dorothea
Luetkenhaus и многие другие программисты из сообщества свободного
программного обеспечения. Все они упомянуты в файлах ChangeLog и THANKS
дистрибутива DDD. Год, место рождения продукта - 1990, дипломный проект
Андреаса Зеллера, создавшего VSL - визуальный язык структур для
отображения структур данных и программ и дипломная работа Доротеи Люткехаус в
1994 с реализацией DDD.
|
![]() |
Иконка в дистрибутиве. Стандартное действие по вызову |
ddd | Вызов из командной строки без предварительных ключей |
Alt+F2/выполнение DDD |
В RedHat под KDE/GNOME. Использовать окно выполнения. В нем можно указать и ключи и параметры отладчика также, как и в командной строке |
ddd
--help
ddd -h ddd -? |
Вывести список ключей DDD для определения среды отладки до начала работы. Основные ключи - см. выбор подчиненного отладчика и собственные ключи подчиненных. |
ddd --maintenance | Включить меню Maintenance. Это дополнительная кнопка в полосе меню. По умолчанию меню выключено. Содержит операциии с дампом памяти и игру Tic Tac Toe - чтобы сделать партию в крестики/нолики, пока мысль зреет |
ddd --debugger имя | Вызвать подчиненный отладчик с указанным именем, если не устраивает автоматический вызов | Пример вызова DDD с указанием ключа подчиненного отладчика |
ddd --tty | DDD сам становится подчиненным, в другой интерфейсной программе (Emacs, например). DDD включает TTY интерфейс, принимая команды отладчика со стандартного ввода и пересылая вывод отладчика на стандартный вывод, как если бы подчиненный отладчик был вызван непосредственно ![]() |
ddd program | заранее указать программу |
для подчиненных GDB, DBX, Ladebug или XDB указать при запуске исполняемую программу и файл с дампом памяти | |
ddd program 1234 | для отладки работающего процесса - второй аргумент - ID этого процесса. Если нет файла с именем `1234' DDD будет искать файл с дампом памяти. |
Использование DDD с удаленным подчиненным отладчиком | |
ddd --host host_name |
Запустить подчиненный отладчик на удаленной машине host_name |
--rhost
host_name --rhost name@host_name |
Запустить подчиненный отладчик в интерактивном режиме на удаленной машине host_name. Если задано имя-пользователя, и не задан ключ --login, использовать его в качестве имени удаленного пользователя name. |
Ключи XWindow используются с одним дефисом.
-display дисплей | Использовать X-сервер дисплей. По умолчанию дисплей берется из переменной среды DISPLAY |
-geometry геометрия | Задает начальный размер и позицию консоли отладчика |
-iconic | Запустить DDD в свернутом виде |
-name имя -title имя |
Дать DDD указанное имя и Дать окну DDD заголовок имя |
-selectionTimeout время | Задает промежуток времени (в миллисекундах), в течение которого два общающихся приложения должны ответить друг другу на запрос о выделении |
-xrm строка-ресурса | Задает имя ресурса и его значение, перекрывающее установку по умолчанию |
Нет возможности перечислить все ключи каждого из подчиненных - их достаточно много и кроме того, есть зависимость от версии. Убедившись, что выбранный подчиненный, command_line отладчик присутствует в системе, обратитесь к его man-странице или воспользуйтесь адресом документации, указанным здесь в таблице. Основные ключи подчиненных отладчиков даны в самом руководстве по DDD.
Если сам DDD - графический интерфейс,
отладчик | платформа | подключение | комментарий |
Для отладки исполняемых двоичных
файлов C, C++,Паскаль, Ада, Модуль-2, Модуль-3, Фортран, Java, Chill | |||
GDB | GNU/Linux | Рекомендуемый; встает в пару к DDD по умолчанию, если не было сделано дополнительных настроек | |
DBX | UNIX DEC AIX |
предоставляет меньше возможностей, чем GDB, и не все поддерживаться в DDD. Но иногда справляется там, где GDB не в силах. Проблемы с паскалеобразными программами в индексации массивов - всегда считает с единицы. В DEC, AIX нет автоматического отображения данных, только по команде "print". | |
Ladebug | DEC UNIX Linux системы |
альтернатива GDB и DBX со всеми его ограничениями. Возможностей меньше, но может выручить, если другие отладчики не справляются. Есть поддержка для COBOL | |
XDB | HP-UX | Нет автоматического отображения данных - только по команде "p"; потерял поддержку в поздних выпусках DDD | |
WDB | По существу - вариант GDB | ||
Для отладки программ, работающих с интерпритатором | |||
JDB | Java Нет автоматического отображения данных - используется команда "dump" | ||
PYDB | Python | ||
PERL | Perl Нет автоматического отображения данных - используется команда "x" |
Если вызов DDD идет без ключей, но имя самой программы указано явно в командной строке или выбрано в графическом диалоге, то подчиненный отладчик будет выбран автоматически, если, конечно он существует на данной системе.
Все компоненты набора из самого DDD, подчиненного отладчика и исследуемой программы можно запускать на разных машинах.
Запуск DDD на удаленной машине, используя текущую машину в качестве X-дисплея,к которому следует подсоединиться. Вместо ключа -display можно установить переменную среды DISPLAY. | |
дисплей - имя например: your_host_name:0.0 | |
Использование DDD с удаленным подчиненным отладчиком | |
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?)
Перед выходом из текущего сеанса есть возможность сохранить состояние отладчика, чтобы продолжить работу позже. Для этого, выбрав `File => Save Session As', и назначив в диалоге символьное имя для сеанса, можно просто закрыть последнее окно DDD. Но возможны и варианты:
`File => Exit' | Выбрать в верхнем меню главного окна DDD | quit | Набрать команду в подсказке отладчика |
q Ctrl+Q Ctrl+D | c GDB и XDB можно и так выйти |
Ctrl+C kill |
В случае, если DDD завис - прервать по SIGINT, или командой UNIX/Linux |
Если вызов DDD идет без ключей, но имя самой программы указано явно в командной строке или выбрано в графическом диалоге, то подчиненный отладчик будет выбран автоматически, если, конечно, он существует на данной системе.
Если очень коротко - необходимые ресурсы, которые нужно иметь для работы с отладчиком:
Небольшая
программа node на C продемонстрирует некоторые возможности
отладчика.
Программа занимается древовидной сортировкой. Определяется структура
node, ссылающаяся сама на себя. Функция new
возвращает указатель на вновь созданную вершину дерева, содержащую целочисленное
значение, передаваемое в качестве параметра. Переменной newval
присваивается значение вершины, созданной последней. Определяется функция
print для печати дерева. Функция split вставляет
новую вершину в упорядоченное дерево с заданным корнем так, чтобы недавно
вставленные вершины находились вблизи от корня дерева.
Чтобы воспользоваться услугами DDD, необходимо при компиляции создать
отладочную информацию и включить ее в объектный код программы. Без отладочной информации подчиненный отладчик не сможет найти исходный код. Для этого используется ключ
-g при вызове компилятора GNU C:
Теперь можно запустить отладчик. Если есть желание это сделать из командной
строки, то лучше указать фоновый режим:
![]() |
Полоса меню. Все открытые меню можно отделять по пунктирным линиям и разбрасывать по рабочему столу. |
Панель инструментов c полем аргументов. Кнопки активизируютя только когда они полезны. |
Окно данных. Здесь в компактной графике появляются исследуемые объекты. |
Окно исходного кода. |
Окно машинного кода - встает не по умолчанию. Здесь оно только для наглядности. |
Консоль отладчика. |
Строка состояния, и справа - зеленый индикатор занятости - подчиненный к работе готов! |
Панель команд появляется как отдельное окно на фоне основного. |
Окон и кнопочек в отладчике много и что самое приятное - в большинстве своем их назначения интуитивно понятны.
Настройки интерфейса.
Размер всех окон можно менять и даже разъединить их выбрав:
Существует возможность добавлять кнопки в консоли, исходнике, в окне данных с помощью редактора кнопок:
Чтобы в текстах
программ была возможность читать комментарии
на родном языке, желательно настроить в KOI8-r равноширинный шрифт, который
используется для исходного кода:
Загрузка программы
Найти в полосе меню:
Отладчик вызван, программа загружена. DDD ждет Ваших распоряжений.
Точки прерывания
Прежде чем запустить программу, необходимо выбрать и расставить точки прерывания. В
node ее можно поставить в главной подпрограмме до начала
выполнения оператора print, чтобы не дать программе преждевременно
завершиться. Для этого - подвести курсор к началу строки, кликнуть правой
кнопкой и задержать ее. Появится еще одно меню. Выбрать Set BreakPoint.
Результат - см на
Есть возможность раскидать точки останова, используя регулярное выражение в ():
Активизация программы
И здесь возможны варианты. Если воспользоваться кнопкой Run на панели
команд - это то окно, которое выскакивает вместе с главным - то программа
node не получит своих данных и завершится при первом проходе с
результатом 1.
Есть еще один сособ запуска, удобный тем, что сразу можно ввести аргументы. В
полосе меню найти и открыть:
Зеленая стрелка в окне с исходным кодом на Рисунке 1 указывает на строку, которая будет выполнена следующей. Способ передвижения по исходному коду:
Используя next - кнопка next на панели команд - идем по коду. Можно избежать многократное нажатие на кнопку навигации по программе, использовав
возможность игнорировать несколько раз точку прерывания, или задать ей булевое условие. Это уже из области редактирования свойств точек останова. На символе точки в окне с исходным кодом нажать правую кнопку мыши. Выбрать из всплывающего меню пункт Properties, немного поработать с диалоговым окном и подтолкнуть програму еще раз.
Пока программа в работе, можно отслеживать значения простых
переменных:
Наведем курсор на root - в появившейся желтой подсказке появится 16-ричное значение этого указателя на структуру типа struct nodept. Таким же способом можно узнать информацию о любой переменной, если она доступна в данный момент. Во время пошаговой работы программы, в нижнем окне - консоли - выводится дополнительная информация от подчиненного отладчика. Например, кроме всех введенных команд, там можно наблюдать изменение значения переменной argc - количества уже отсортированных данных.
| Следующий шаг. Кликнем правой клавишей мыши над тем же именем указателя. В появившемся меню выберем Display Start*. DDD автоматически разыменует указатель и покажет в окне данных содержащиеся в структуре данные. Если значение поля left или right отлично от нуля, то это поле указывает на другую структуру. Если дважды щелкнуть на этом поле, появится новая рамка с содержимым другой структуры с указателем в виде стрелки. Через несколько шагов получим что-то похожее на Рисунок 2: |
По умолчанию DDD не распознает разделяемые структуры данных т.е. объект, на который ссылаются несколько других объектов. Например, если два указателя ссылаются на один и тот же объект , отображения будут различными, хотя они и обозначают один и тот же объект. | |
Т.к. в данном сеансе оказалось, что рамка со структурой продублировалась, т.е. структура
отобразилась более одного раза, придется воспользоваться специальным режимом детектирования псевдонимов,
alias detection, чтобы убрать лишнее:
В результате получаем Рисунок 3. Пока такие вещи возможны только при использовании языков C, C++ и Java | |
|
Если вспомнить, что программа node должна сортировать то что ей
предложено в самом начале, то хорошо бы это дерево и увидеть в окне, а не кучу
структур. Такая возможность существует:
И кроме того, изображенное отладчиком дерево можно повернуть в удобном для просмотра направлении. На самом деле, отладчик допускает перетаскивание рамок с данными в пределах окна данных вручную - мышкой. Так что всегда рисунок можно подправить. |
Редактирование и перекомпиляция
Не предоставляется возможности изменять текущий отображаемый файл в самом DDD, но при необходимости DDD откроет текстовый редактор. Для этой цели либо используется кнопка Edit, либо выбор:
И еще одно замечание: функции из 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 с ключами -g для создания отладочной информации и -lm для подключения математической библиотеки:
|
- вызов отладчика |
- загрузка программы |
- установка точек прерывания |
- запуск программы |
В первой части своей работы программа заполняет одномерный массив sarr. Чтобы построить график массива фиксированного размера, достаточно выделить его имя щелчком левой клавиши. Имя массива появится в поле аргумента. Далее - найти и щелкнуть в полосе меню кнопку Plot. Появится новое окно с графиком функции f(x) как на Рисунке 5. В окне данных можно одновременно просматривать числовые значения аргумента функции в виде таблицы. График и таблица обновляются автоматически во время изменения или по мере заполнения массива sarr.
|
Во второй части программы создается динамический массив значений двумерной функции f(x,y). Для исследования динамического массива последовательность действий должна быть иная.
DDD не в состоянии автоматически определить размер динамически создаваемых массивов и если просто отщелкнуть имя динамического массива, DDD откликнется лишь напоминанием Nothing to display - нет данных для отображения. Есть плохой выход - заполнять статический двумерный массив и иметь проблемы с памятью. Но лучше использовать способность GDB отображать последовательные объекты в непрерывной области памяти. Ссылаться на непрерывную область памяти можно с помощью бинарного оператора @ подчиненного отладчика GDB . Для данной программы в консоли отладчика набрать команду:
Чтобы освободить себя от тяжелой работы прописывания в консоли таких длинных команд, как в последнем сеансе, полезно знать, что можно пользоваться Command History, историей команд:
Тут могут быть проблемы. Рассмотренные отладчики ориентированны все-таки на языки C и C++, как традиционные языки разработки систем. Отладчик не может понять отдельные специфические моменты в языках программирования, если для них нет аналогов в C и C++
.
DDD прекрасно определяет язык программирования в программе, с которой к нему пришли, но в фортран-программе, например, при компиляции с опцией -g не создается отладочной информации для переменных COMMON блока и EQUIVALENCE. К сожалению, не появится желтая подсказка в окне с исходным кодом и команда в консоли (gdb): display ... Вам не поможет. Тем не менее, есть возможность обратиться к памяти, выделенной для COMMON и EQUIVALENCE. Что касается версии 0.5.19 компилятора g77, предлагаются опции -fdebug -kludge для создания информации о памяти этих областей для отладки. В поздних версиях g77 эти опции уже не сработают и компилятор попросит использовать опцию -g.
Решение проблемы: воспользоваться командой подчиненного отладчика GDB в консоли DDD:
Отладка программ, написанных на Free Pascal также вынуждает учитывать отличие его от языка C. Перечисление проблем и их решения - см. в статье Ильи Аввакумова