Повышение производительности при помощи IBM Debugger for AIXИсточник: IBM
Решение IBM Debugger входит во многие продукты IBM, предназначенные для разработки программного обеспечения. Программа представляет собой интерактивный отладчик на уровне исходных кодов, помогающий отлаживать приложения, написанные на разных языках программирования и работающие на разных платформах. Ключевой функциональной возможностью IBM Debugger является наличие клиентской части с единым пользовательским интерфейсом, которая способна взаимодействовать с различными механизмами отладки. Механизм отладки всегда выполняется на родной платформе, тогда как интерфейсная клиентская часть выполняется на удаленном компьютере. Для начала сеанса отладки механизм отладки подключается к интерфейсной клиентской части через сетевое соединение. Перед современными компаниями-разработчиками программного обеспечения стоит задача разработки в сжатые сроки высококачественных продуктов, отвечающих на потребности пользователей. Одним из способов достижения этой цели является использование продукта IBM Debugger for AIX для повышения качества и сокращения сроков реализации решений. В данной статье рассказывается, как эффективно использовать IBM Debugger for AIX для достижения этих целей. Поддерживаемые платформы и языки программирования Хотя компоненты IBM Debugger for AIX поставляются во многих продуктах IBM, в данной статье особое внимание уделяется использованию IBM Debugger с компиляторами IBM XL C/C++ и COBOL для AIX. (В разделе "Ресурсы" в конце статьи приведены ссылки на продукты IBM, поддерживающие отладку с использованием технологии, применяемой в IBM Debugger for AIX, а также дополнительные возможности.) IBM Debugger for AIX позволяет выполнять отладку AIX-программ, написанных на языках программирования C, C++ и (или) COBOL. Интерфейсная клиентская программа работает на системе Microsoft® Windows® и подключается удаленно по сети к механизму отладчика, выполняющемуся на AIX. Инструментальная программа IBM Debugger использует модель клиент/сервер, в которой клиентская программа с пользовательским интерфейсом (UI) подключается к удаленному механизму отладки (debug engine) для создания сеанса отладки. Такая модель отладки является одним из главных преимуществ данного решения, поскольку UI может общаться с несколькими различными механизмами отладки одновременно. Это взаимодействие обрабатывается посредством скрытого процесса - демона (daemon), работающего в UI-клиенте. Собственно работа по отладке выполняется в механизмах отладки: например, механизмы отладки управляют выполнением исследуемого кода, считывают отладочную информацию из исполняемых загрузочных модулей целевой машины, устанавливают точки прерывания, вычисляют выражения и дизассемблируют программные инструкции. Чтобы все это делать, механизм отладки должен иметь полную информацию о формате отлаживаемого исполняемого файла, а также информацию о среде, в которой он работает. Компилирование программы с отладочной информацией Для отладки программы на уровне исходных кодов необходимо выполнить ее компиляцию с определенными параметрами, указывающими компилятору сгенерировать символьную информацию и отладочные ловушки (debug hook) в объектном файле. Для компилятора IBM XL C/C++ Enterprise Edition for AIX выполните компиляцию с отключенной оптимизацией (-O0) и с параметром -g. В клиентской части имеется демон, прослушивающий соединения с механизмом отладки. Демон является связующим звеном между клиентской частью и механизмом отладки и должен быть настроен до начала сеанса отладки. Отладочный демон прослушивает определенный порт на предмет соединений с механизмом отладки. Для начала отладки необходимо убедиться в том, что демон готов принимать соединения. Просмотреть и изменить состояние отладочного демона можно при помощи кнопки демона в инструментальной панели представления Debug в клиентской программе. Если демон прослушивает соединения, пиктограмма имеет вид . Если демон не прослушивает соединения, пиктограмма имеет вид . По умолчанию демон использует порт 8001. Если клиентская часть выполняется на многопользовательской машине, порт демона по умолчанию может быть уже занят другим сеансом отладки. При получении сообщения о неудачном запуске отладочного демона можно изменить номер порта демона в представлении Debug или на странице Debug Daemon preference, указав либо другой номер порта, либо диапазон номеров портов. Отладку программы можно выполнять удаленно, запуская клиентскую часть и механизм отладки на разных машинах. Запустите клиентскую часть на машине с системой Microsoft Windows и свяжите с ней удаленный механизм отладки, работающий на AIX, для подключения . Чтобы начать сеанс отладки, выполните следующие действия:
Команда irmtdbgc поддерживает несколько параметров командной строки и распознает несколько переменных среды. Например, переменная среды DER_DBG_ADDR содержит значение по умолчанию для параметра -qhost. Чтобы получить справочную информацию по использованию команды irmtdbgc, можно выполнить команду irmtdbgc -help в командной строке. После установки соединения между клиентской частью и механизмом отладки можно приступить к отладке исходного кода. На следующем снимке экрана показан пользовательский интерфейс программы для сеанса отладки, в котором пользователь выполняет отладку программы sort: Рисунок 1. Успешное соединение механизма отладки с пользовательским интерфейсом
Отладчик отображает много информации. Она сгруппирована в различные разделы, называемые представлениями (view). В следующем разделе будут рассмотрены наиболее важные представления, имеющие отношение к различным задачам отладки. Наверное, самым используемым является представление Debug (отладка), которое является главным центром управления сеансом отладки. Кроме представления Debug, пользовательский интерфейс имеет несколько других представлений для отображения специальной информации, включая Monitors (мониторы), Breakpoints (точки прерывания), Memory and Modules (память и модули), Variables (переменные) и Registers (регистры). Пиктограммы, расположенные в панели инструментов каждого представления, предоставляют дополнительные полезные действия. Для отображения всплывающей подсказки, описывающей действие, можно поместить курсор мыши над соответствующей пиктограммой. Поэкспериментируйте с каждой из них. Представление Debug - это отправная точка любого сеанса отладки. Каждое новое соединение клиентской части с механизмом отладки добавляется в это представление для управления. Для каждого отлаживаемого процесса представление Debug отображает все его выполняющиеся подпроцессы (thread). В свою очередь, для каждого приостановленного подпроцесса отображается список фреймов стека (stack frame), представляющих иерархию вызовов. Кроме представления Debug, пользовательский интерфейс содержит несколько других представлений для отображения специальной информации, включая Variables, Breakpoints, Registers, Monitors, Memory и Modules. Кроме того, отлаживаемый в данный момент исходный файл отображается в редакторе исходных кодов (Source editor). Содержимое почти всех других представлений зависит от "активного" сеанса отладки. Сеанс отладки активизируется путем выбора цели отладки либо любого из ее компонентов (например, подпроцессы, фреймы стека) в представлении Debug. При активизации сеанса отладки содержимое остальных представлений в пользовательском интерфейсе обновляется. Представление Breakpoints является центром управления точками прерывания. Здесь всегда можно просмотреть список установленных точек прерывания, а также добавить новую точку прерывания, щелкнув правой кнопкой мыши в представлении и выбрав одну из опций подменю Add Breakpoint. Поддерживаются точки прерывания различных типов, которые рассматриваются более подробно далее, в разделе "Типы точек прерывания". Точки прерывания можно сделать временно неактивными, запретив их. В представлении Breakpoints разрешенные точки прерывания обозначены галочкой, и путем переключения этого флажка их можно запрещать или разрешать. Пошаговое прохождение по программе
Начиная с первой желтой стрелки, элементы управления имеют следующие названия: Step Into (шаг с заходом во вложенные блоки), Step Over (шаг с обходом вложенных блоков) и Step Return (выполнение до возврата из блока). Эти команды доступны также из меню run. Также использовать "горячие" клавиши (keyboard shortcut) - F5, F6 и F7 соответственно. Если вы укажете программе команду Run (F8), выполнение будет продолжено до следующей точки прерывания или до завершения программы. В представлении Variables отображается список переменных, доступных в области действия (in-scope), при каждой остановке подпроцесса или программы. Кроме того, в представлении Variables после каждой остановки программы выделяются изменения в этих переменных. В этом представлении доступно несколько действий. Чтобы узнать, что можно сделать в определенной ситуации, вызовите контекстное меню, щелкнув правой кнопкой мыши где-нибудь в представлении. В представлении можно также поменять значения переменных, и если это сделать, то новое присвоенное значение становится действительным немедленно. Можно также изменить способ отображения переменной. Например, чтобы отобразить целое число в двоичном формате вместо используемого по умолчанию десятичного, нужно активизировать контекстное меню Change representation выбранной переменной. Естественно, способность просматривать исходный код отлаживаемой программы является критически важной для отладки. Механизм отладки пытается найти исходный код программы на основе отладочной информации, имеющейся в этой программе. Путь поиска исходных кодов по умолчанию содержит просто механизм отладки. Это означает, что механизм отладки, основываясь на информации о пути к файлам, содержащейся в скомпилированной с параметром Рисунок 3. Доступ к редактору пути поиска исходных кодов
Помимо отображения исходного кода, есть еще два варианта просмотра программы в отладчике; можно выбрать показ результатов дизассемблирования программы и выполнять пошаговое прохождение по ассемблерному коду или использовать смешанное представление для одновременного отображения исходного и дизассемблированного кода программы. В справочной системе отладчика содержится дополнительная информация о том, как выбрать наиболее подходящий для вашей программы вариант. Отметим, что пошаговое прохождение по дизассемблированному или смешанному представлению осуществляется по командам ассемблера, тогда как пошаговое прохождение по исходному коду осуществляется по выражениям. Иногда может оказаться, что программа проскочила интересующую нас точку и нужно перезапустить сеанс отладки. К счастью это можно сделать, не покидая дружественных пределов пользовательского интерфейса. Просто установите точку прерывания в интересующей вас точке, нажмите кнопку Restart program и запустите программу. Программа остановится на установленной точке прерывания. Рисунок 4. Перезапуск активного сеанса отладки
Клиентская часть отладчика построена на основе среды с открытыми исходными кодами Eclipse и пользуется всеми преимуществами ее развитой справочной системы. Например, если поместить курсор мыши над кнопкой панели инструментов, появится всплывающая подсказка, а при нажатии клавиши F1 отобразится контекстная справочная информация для данного представления. Пункт Key assist... в меню Help позволяет легко просмотреть все доступные "горячие" клавиши. Рисунок 5. Активные "горячие" клавиши В данном разделе рассматриваются некоторые более углубленные возможности IBM Debugger. Они позволяют быстрее определить проблему и входят в число важнейших преимуществ использования решения IBM Debugger. Иногда фрагмент кода вызывается много раз, даже из различных подпроцессов, но нужно остановиться только при удовлетворении конкретного условия. Именно здесь очень полезна страница условий (conditional) мастера точек прерывания. Эта вторая необязательная страница (к ней можно обратиться, нажав кнопку Next вместо Finish на главной странице) позволяет работать с подобными ситуациями. Можно управлять подпроцессом, в котором нужно остановиться, частотой остановок и даже определить логическое (булево) выражение, которое должно стать истинным перед остановкой. Можно также установить несколько условных точек прерывания в одном и том же месте; их можно легко разрешать или запрещать в представлении Breakpoints. Различные типы точек прерывания Программа IBM Debugger for AIX предоставляет следующие типы точек прерывания.
Все точки прерывания можно создавать из контекстного меню представления Breakpoints. Представление Modules отображает исходные файлы программы, включая определения функций. Эти файлы можно просмотреть в редакторе исходных кодов, открывая их из представления Modules. Можно также устанавливать точки прерывания при входе в функцию, щелкая правой кнопкой мыши на элементах функции в представлении. Рисунок 6. Представление Modules
Представление Monitors позволяет хранить набор интересующих вас переменных для удобства доступа к ним и их изменения. Если нам, например, нужно контролировать значение конкретной переменной или выражения при каждой остановке приложения, мы можем создать монитор для переменной или выражения, и этот монитор будет виден в представлении Monitors. Это особенно полезно для наблюдения за изменением глобальных переменных в течение сеанса отладки. Можно выполнять мониторинг любого корректного выражения, например, простой локальной переменной или конкретного элемента массива. В приведенном ниже примере имеется точка прерывания в строке 22 приложения внутри цикла. При любой активизации точки прерывания можно определить, является ли переменная Рисунок 7. Выражение для мониторинга
Для этого можно добавить монитор для выражения Рисунок 8. Монитор в представлении Monitors
После каждого шага значение монитора обновляется, и если оно изменилось, это обозначается для облегчения идентификации. Мониторы можно добавлять и другими способами: можно выполнять мониторинг локальной переменной из представления Variables или из представления Monitors путем нажатии кнопки в представлении Monitors и ввода соответствующего выражения. Если нужно выполнить мониторинг одной или нескольких глобальных переменных, выберите их из списка всех глобальных переменных, находящихся в области видимости, выбрав пункт Select Globals list в контекстном меню в представлении Monitors. Значение контролируемой переменной можно изменить, и это изменение становится действительным немедленно. Визуализация и отображение памяти Представление Memory позволяет контролировать и изменять содержимое памяти по конкретному адресу, обычно адресу переменной. Можно также выбирать, в каком формате будет отображаться содержимое памяти: Hex, ASCII, EBCDIC, signed integer (целое со знаком) и unsigned integer (целое без знака). Выражение, адрес которого используется как основа выражения, называется монитором памяти (memory monitor). Для добавления и удаления мониторов памяти можно использовать панель monitors в представлении Memory. Отметим, что мониторы памяти отличаются от рассмотренных в предыдущем разделе мониторов, использующихся в представлении Monitors. На рисунке 9 показана визуализация памяти Signed Integer переменной "it". Адрес переменной в памяти - 0x2FF22938, а ее текущее значение равно 10. Рисунок 9. Мониторинг переменных в представлении Memory
Содержимое памяти можно просматривать в различных форматах одновременно. Рисунок 10. Просмотр переменной в виде signed integer и в шестнадцатеричном представлении
Полезной функциональностью в представлении Memory является действие Reset to Base Address в контекстном меню. Если вы потеряли начальный адрес визуализации, можно использовать данное действие, чтобы легко перейти в это место. Функциональность отображения памяти (memory mapping) позволяет отображать фрагмент оперативной памяти в соответствии со схемой, определенной в XML-файле. Это полезно, например, если нужно отобразить блоки памяти, определенные вне программы. Для создания визуализации карты памяти необходимо выбрать файл в файловой системе, определяющий схему, которую вы хотите использовать. Чтобы создать отображение для переменной: выберите переменную или монитор в представлении Variables или Monitors, а также Choose Monitor Memory > Map... в контекстном меню. Затем укажите XML-файл, используемый в качестве схемы для отображения. При этом (a) создастся новый монитор памяти для переменной в представлении Memory, и (б) создастся новая визуализация карты памяти, использующая этот файл. В простейшем варианте средство отображения памяти позволяет определить схему для сложной переменной, например union (объединение) или structure (структура). Для структуры:
соответствующий файл схемы будет выглядеть следующим образом:
Такой способ полезнее, чем любые другие типы визуализации, поскольку он позволяет контролировать логическую организацию памяти. Каждое поле (field) определяет именованную область памяти длиной в 1 или несколько байт с необязательным текстовым описанием, имеющим смысл в контексте программы. Атрибут type используется для указания способа визуализации памяти, например HEX, Decimal, ASCII и т.д. Дополнительным преимуществом является то, что содержимое памяти можно отобразить рядом с исходными данными, представленными в виде столбцов. Ниже показан снимок экрана с визуализацией памяти для экземпляра данной структуры, использующей приведенный выше XML-файл. Рисунок 11. Карта памяти, отображенная в представлении Memory
Если посмотреть на визуализацию памяти внимательнее, можно заметить, что в ней есть несколько столбцов, предоставляющих подробную информацию о каждом поле. В столбце Value для каждого поля отображается содержимое памяти по данному смещению. В столбце Offset отображается смещение каждого поля от начального адреса отображения. В столбце Description отображается предоставленная пользователем информация о каждом поле. Этот столбец полезен для добавления дополнительной информации об интересующих вас участках блока, особенно при совместном использовании карт разными разработчиками. Описание можно изменить при визуализации, и новое описание можно при желании автоматически сохранить в соответствующем XML-файле. Для реализации этой функциональности откройте страницу Memory map preferences из меню представления Memory и отметьте флажок When editing groups and descriptions always save the changes to the file (при редактировании групп и описаний всегда сохранять изменения в файле). Для упрощения идентификации при визуализации памяти используются цветовые индикаторы, выделяющие один или несколько изменившихся байтов. Можно также разместить рядом две различные визуализации для сопоставления, как показано ниже. Рисунок 12. Изменения в памяти, показанные в нескольких параллельных визуализациях
Область слева, отмеченная как "A", представляет собой визуализацию карты памяти для монитора, тогда как область "B" содержит представление этого же участка памяти, интерпретированное как целые числа со знаком. Данная возможность позволяет просматривать логическое размещение блоков памяти, используя карту памяти, а также содержимое памяти до и после структуры. Средство отображения памяти имеет и другие функциональные возможности, о которых можно узнать более подробно в официальной документации по продукту. Содержимое различных регистров можно контролировать и изменять при помощи представления Registers. Регистры в приложении подразделяются на три группы: General (общие), Floating Point (с плавающей запятой) и Special Purpose (специальные). Регистры специального назначения определяются системой; на экране показаны такие регистры для AIX. Регистр IAR (Instruction Address Register) содержит адрес текущей команды, т.е. команды, которая сейчас должна выполниться. Представление Registers похоже на представление Variables в том, что изменения в регистрах выделяются цветом. Регистры можно добавлять в представление Monitors и контролировать их изменения. Кроме того, в представлении Memory можно контролировать содержимое их памяти. Рисунок 13. Регистры, доступные в программе, можно просматривать в представлении Registers
Консоль отладки (debug console) позволяет выполнять сеанс отладки в командной строке. Команды можно выдавать непосредственно в механизм отладки и просматривать результат в консоли, что позволяет выполнять интерактивную отладку. Поддерживаемые команды зависят от механизма отладки, и на AIX они могут быть отображены путем ввода команды "help" в консоли отладки. В AIX можно включить режим "echo", и вводимые команды можно экспортировать и импортировать впоследствии. Это позволяет "зарегистрировать" свои действия в отладчике и сгенерировать сценарий, который можно будет использовать повторно для перевода отлаживаемой программы в нужное состояние. На приведенном ниже снимке экрана столбец справа является панелью списка команд, в которой перечислены все введенные команды, а слева расположена панель хронологии команд, отображающая результаты выполнения введенных команд. Для очистки панелей хронологии команд и списка команд, импорта, экспорта и выполнения списка команд можно использовать кнопки панели инструментов.
Независимо от того, как начинается сеанс отладки (из командной строки или из диалогового окна), клиентская часть отладчика может поддерживать любое количество сеансов отладки одновременно. Как упоминалось выше, каждый новый сеанс отладки представляется как цель отладки (debug target) в представлении Debug. Содержимое почти всех других представлений, включая редактор исходных кодов, представления Monitors, Registers, Modules, Variables и Memory, будет обновляться в зависимости от активного сеанса отладки. Изменение выбранной цели отладки в представлении Debug вызывает переключение сеанса и обновление остальных представлений. На следующем снимке экрана показан отладчик с двумя активными сеансами отладки. Рисунок 15. Несколько сеансов отладки, выполняющихся в одном пользовательском интерфейсе
Инструментальная программа IBM Debugger поддерживает отладку в едином пользовательском интерфейсе приложений, написанных на разных языках программирования и на разных платформах. Кроме базовой функциональности отладки, такой как пошаговое выполнение и установка точек прерывания, программа предоставляет множество расширенных функций, в том числе отображение памяти, удаленный перезапуск и несколько типов точек прерывания. Для использования этих и других возможностей обратитесь за подробной информацией к документации по IBM Debugger.
Получить продукты и технологии
|