
Профилирование на языке C/C++ – учебный курс по среде IDE NetBeans 6.8
Составитель: Сьюзан Морган (Susan Morgan)
Декабрь 2009 г. [номер версии: V6.8-1]
Содержание
Требования
Для работы с этим учебным курсом требуется программное обеспечение, указанное ниже.
См. разделы Указания по установке среды IDE NetBeans 6.8 и Настройка среды IDE NetBeans для C/C++/Фортран для получения информации о загрузке и установке требуемого программного обеспечения.
Введение
Среда IDE NetBeans 6.8 с подключаемым модулем C/C++ предоставляет новые средства для наблюдения за проектами и позволяет определять ошибки времени выполнения в приложении. При отладке кода подобные проблемы могут быть пропущены. Существуют следующие средства профилирования C/C++:
- Использование ЦП
- Использование памяти
- Использование потоков
- Объем ввода-вывода (только на платформах Solaris)
- Микросостояния потоков (только на платформах Solaris)
Данные средства предоставляют сведения в графической форме. При нажатии на кнопки пользователь может просмотреть более подробные сведения о проблемных областях приложения.
В этом руководстве описано использование функций профилирования среды IDE NetBeans для проектов C/C++, в том числе средств анализа использования ЦП, памяти и потока.
Средство анализа использования ввода-вывода описано в разделе Профилирование ввода-вывода для проектов C/C++ в операционных системах Solaris
Средство анализа микросостояний потоков описано в разделе Использование средства анализа микросостояний потоков в операционных системах Solaris.
Поддержка платформ для профилирования NetBeans C/C++
Средства профилирования C/C++ используются автоматически при выполнении проекта NetBeans в операционных системах Solaris, OpenSolaris и Linux. Средства профилирования собирают информацию о среде выполнения проекта с помощью внешних ресурсов, выполняемых в операционной системе, в которой запущен проект. Ресурсы, необходимые для подробной информации, не доступны на платформах Windows и Mac.
В этом учебном курсе используется проект, выполняемый в системе на базе процессора Solaris SPARC с использованием средств Sun Studio. При этом наличие коллекции средств Sun Studio на платформах Solaris необязательно, так как средства профилирования также могут использовать средство Solaris DTrace для получения сведений о запущенных программах. При использовании ОС OpenSolaris можно установить программное обеспечение Sun Studio с помощью диспетчера пакетов или с помощью ввода команды pkg install sunstudio в окне терминалов.
На платформе Linux следует установить программное обеспечение Sun Studio для использования средств профилирования C/C+ в среде IDE NetBeans. Средства Sun Studio находятся в свободном доступе на сайте http://developers.sun.com/sunstudio.
В следующей таблице отражены операционные системы и коллекции средств, поддерживающие средства профилирования C/C++.
| Использование ЦП |
 |
 |
В случае работы на платформе Linux наличие средств Sun Studio является обязательным. |
| Использование памяти |
 |
 |
В случае работы на платформе Linux наличие средств Sun Studio является обязательным. |
| Использование потоков |
 |
 |
В случае работы на платформе Linux наличие средств Sun Studio является обязательным. |
| Объем ввода-вывода |
 |
 |
Вместо средств Sun Studio используется средство Solaris DTrace. |
| Микросостояния потоков |
 |
 |
Вместо средств Sun Studio используется средство Solaris DTrace. |
Если используются системы Windows или Mac и доступна система Solaris, OpenSolaris или Linux, обратите внимание на то, что среду IDE можно запустить на компьютере под управлением Windows или Mac, настроенном для удаленной разработки в системах Solaris, OpenSolaris или Linux. Удаленная разработка позволит использовать средства профилирования даже при запуске среды IDE в системе Windows. Для получения дополнительных сведений о настройке сборки на удаленном узле разработки см. Учебный курс по удаленной разработке на языке C/C++.
Добавление средств Sun Studio к среде IDE NetBeans
Если средства Sun Studio установлены после установки среды IDE NetBeans или в том случае, если средства Sun Studio не включены в путь, необходимо указать в среде IDE расположение средств Sun Studio, как описано ниже. Если средства Sun Studio не используются, то эту процедуру можно пропустить.
- Выберите команду "Tools > Options".
- Щелкните элемент "C/C++" в верхней части диалогового окна "Options".
- Щелкните вкладку "Build Tools". На этой вкладке средство "Tool Collection" отображает наборы средств, найденные на текущем узле разработки. Набор средств по умолчанию выделяется полужирным шрифтом и выбирается для любого создаваемого проекта.
- Выберите узел разработки, который необходимо добавить к набору средств. В этом примере среда IDE выполняется на локальном узле Solaris.
- Выберите команду "Add" под списком "Tool Collection".
- В диалоговом окне введите путь базового каталога для набора Sun Studio в текстовом поле "Base Directory" или используйте кнопку "Browse" для перехода к каталогу набора
bin. Средства Sun Studio, скорее всего, установлены в каталоги /opt/sunstudio12, /opt/sun/sunstudio12 или /opt/SUNWspro, в зависимости от версии Sun Studio и операционной системы.
Обратите внимание: если узел разработки не равен localhost, то функция "Browse" недоступна. Необходимо ввести полный путь к базовому каталогу средств bin на удаленном сервере. Выберите команду "Check", и среда IDE выполнит проверку действительности введенного пути для поддерживаемого набора средств.
- Поля "Tool Collection Family" и "Tool Collection Name" заполняются автоматически. При необходимости можно указать другое имя набора.
- Нажмите кнопку "OK" в диалоговом окне "Options".
Создание проекта на языке C/C++ для учебного курса
Чтобы продемонстрировать работу функций профилирования C/C++, создадим новый проект из примера приложения ProfilingDemo, который включен в состав среды IDE.
- Откройте мастер "New Project" с помощью команды "File" > "New Project".
- Выберите в мастере категорию "Samples", а затем – подкатегорию "C/C++".
- Выберите пример "Profiling Demo", как показано на рисунке, а затем нажмите кнопку "Next".
-
Разработчик может выбрать любое имя и расположение проекта. В данном примере используется имя "ProfilingDemo_1" и каталог NetBeansProjects.
- Нажмите кнопку "Finish", чтобы выйти из мастера и создать проект.
Настройка свойств проекта
- Правой кнопкой мыши щелкните узел проекта "ProfilingDemo_1" на вкладке "Projects" и выберите команду "Properties".
- Выберите узел "Build" на панели "Categories".
- Выберите коллекцию средств SunStudio_12 и нажмите кнопку "Применить".
- Выберите узел "Запуск" на панели "Категории". Выберите окно вывода в качестве типа консоли и нажмите кнопку "Применить". Это позволяет отображать выходные данные программы в окне вывода среды IDE, а не во внешнем окне терминала, как показано в этом руководстве.
- Выберите узел "Profile" на панели "Categories". Установите флажок "Показывать индикаторы профилирования во время выполнения".
- Выберите настройку профиля "Sun Studio для C/C++, стандартная версия".
- Нажмите кнопку "..." рядом со списком "Настройка профиля" для открытия окна "Диспетчер настроек средств профилирования". Обратите внимание на то, что для настройки "Sun Studio для C/C++, стандартная версия" выбраны средства анализа использования потоков, памяти и ЦП. Для других настроек профиля выбраны различные комбинации средств. В этом руководстве используется настройка "Sun Studio для C/C++, стандартная версия".
- Для завершения работы без внесения изменений в окне "Диспетчер средств профилирования" нажмите кнопку "Отмена".
- Нажмите кнопку "OK" в диалоговом окне "Свойства проекта".
Создание и выполнение проекта ProfilingDemo
- Правой кнопкой мыши щелкните узел проекта ProfilingDemo и выберите команду "Build".
- На вкладке "Output" отобразятся результаты сборки, как показано ниже.
- Обратите внимание на то, что компилятором является компилятор Sun Studio C cc. Предупреждения компилятора о несоответствии аргументов можно пропустить.
- Правой кнопкой мыши щелкните узел проекта ProfilingDemo и выберите команду "Run".
- Также откроется вкладка "Монитор выполнения", на которой отображаются индикаторы с динамическими графиками, соответствующие использованию ЦП, памяти и потоков.
- Обратите внимание на то, что программа ProfilingDemo выводит сообщения о выполняемых операциях в окне вывода. Это позволяет сравнить вывод с графическими данными средств в среде IDE. Например, программа отображает сведения о выделяемой памяти, выполняет вычисления, а затем освобождает память. График отражает действия программы.
- Нажимайте клавишу Enter при выводе соответствующих запросов вплоть до завершения работы программы.
- Наведите курсор мыши на индикаторы для просмотра всплывающих подсказок с описанием значений графиков.
- Каждый индикатор содержит кнопку, при нажатии которой выводятся более подробные сведения, описанные далее. Сначала следует ознакомиться с элементами управления индикаторов.
Использование элементов управления индикаторов
- В нижней части окна "Монитор выполнения" отображаются ползунки для управления представлением графиков: ползунок "Представление", ползунок "Детали" и ползунок "Время". Ползунки показаны на рисунке ниже. Наведите указатель мыши на конечные точки ползунков для получения сведений о ползунках.
- Нажмите и удерживайте кнопку мыши на горизонтальной полосе прокрутки ползунка "Время" в нижней части окна, а затем переместите ползунок влево, чтобы отобразить начало выполнения программы. Остальные графики также перемещаются, отображая сведения о каждом из аспектов (ЦП, память, потоки) в ходе выполнения, что позволяет отслеживать взаимосвязь параметров.
- Перетащите ползунок времени слева направо, чтобы просмотреть весь процесс запуска.
- Наведите указатель мыши на ползунок представления, который находится над единицами времени. Элементы управления представлением позволяют выделять часть среды выполнения, отображаемой на индикаторе.
- Щелкните и перетащите маркеры ползунка представления влево до начальной точки, то есть до момента начала выполнения. Теперь индикаторы отображают все время выполнения. Это действие аналогично максимально возможному уменьшению масштаба. При выборе всего времени выполнения убедитесь в том, что горизонтальная полоса прокрутки неактивна. В настоящий момент отображаются все данные, поэтому прокрутка невозможна.
- Рассмотрим представленные данные более подробно. Перетащите начальную точку ползунка на 40 секунд от начала, то есть на тот момент, когда начинается выполнение демонстрации PTHREAD_MUTEX_DEMO, как показано в окне вывода. По мере перетаскивания маркера масштаб графиков увеличивается, и на них отображается область с момента 0:40 до окончания выполнения. Обратите внимание на то, что полоса прокрутки снова становится активной и может использоваться для перемещения по интервалу.
- Наведите указатель мыши на конечные точки оранжевого ползунка "Детали" для получения сведений об использовании ползунка. Элементы управления ползунка "Детали" позволяют выбрать часть интервала выполнения для изучения подробных сведений.
- Перетащите маркер начальной точки ползунка "Детали" на 40 секунд от начала и обратите внимание на то, что данные в интервале до начальной точки затемняются. Это позволяет выделить график между начальной и конечной точкой.
При нажатии одной из кнопок подробных сведений индикатора ("Активные точки", "Утечка памяти" или "Проблемы синхронизации") на вкладке подробных сведений отображаются сведения для выделенной области. Таким образом, эти элементы управления используются для фильтрации данных.
- Перетащите начальную точку в начало интервала, чтобы отобразить все данные.
Обзор использования ЦП
На графике "Использование ЦП" отображается процентное значение от общего времени ЦП, используемого приложением при работе.
- Нажмите кнопку "Активные точки" на графике "Использование ЦП", чтобы просмотреть подробные сведения о времени ЦП.
Откроется вкладка "CPU Time Per Function", отображающая функции программы, а также время ЦП, использованное каждой функцией. Функции отображаются по убыванию используемого времени ЦП (т.е. функции, использующие наибольшее время, будут отображаться в начале списка). Если программа в настоящий момент выполняется, то отображается время, затраченное на момент щелчка по графику.
- Щелкните заголовок столбца "Function Name", чтобы отсортировать функции в алфавитном порядке
- Щелкните столбец "CPU Time (Exclusive)", чтобы отсортировать функции по времени, использованному отдельными функциями.
- Обратите внимание на разницу между столбцами времени ЦП. Столбец "CPU Time (Inclusive)" отражает общее время ЦП, затраченное от момента входа в функцию до выхода из нее, включая время всех остальных функций, вызываемой этой функцией. Столбец "CPU Time (Exclusive)" отражает время, использованное только определенной функцией, не включая время других вызываемых ею функций.
- Щелкните заголовок столбца "CPU Time (Inclusive)", чтобы вернуть наверх функции, затрачивающие наибольшее время. Обратите внимание на то, что функция
work_run_usrcpu имеет значения 5,994 и 6,034 в столбцах "Время ЦП ("чистое")" и "Время ЦП (суммарное)" соответственно. Это значит, что только небольшая доля относящегося к ней времени ЦП была использована другими вызываемыми функциями, а основное время было использовано самой функцией work_run_usrcpu.
- Названия некоторых функций отображаются жирным шрифтом. Пользователь может перейти в файл исходного кода, который вызывает эти функции. Дважды щелкните функцию
work_run_usrcpu.
- Откроется файл
common.c, в котором курсор будет расположен на функции work_run_usrcpu в строке 59. Некоторые числа для этой строки отображаются на левом поле.
- Наведите указатель мыши на числа в левом поле. Эти значения совпадают с метриками чистого и суммарного времени ЦП для функций, которые отображаются на вкладке "Время ЦП на функцию". Метрики округляются для сокращения занимаемого ими пространства, но при наведении мыши отображается неокругленное значение. Метрики для строк, интенсивно использующих ЦП (например, для цикла
for, который выполняет вычисления внутри функции work_run_usrcpu), также отображаются в файле исходного кода common.c.
- Установите начальное время временного фильтра равным 0:40. Для этого введите время и нажмите клавишу Enter или используйте стрелки для изменения количества секунд. Графические индикаторы изменяются точно так же, как и при перемещении ползунков в элементе фильтрации данных. При перемещении ползунка параметры временного фильтра на вкладке "Время ЦП на функцию" соответствующим образом изменяются. Кроме того, отображенные для функций в таблице данные также обновляются в соответствии с фильтром, поэтому данные по использованию ЦП отображаются только для установленного временного интервала.
- Помимо этого, возможна также фильтрация данных по определенной метрике. Правой кнопкой мыши щелкните показатель "Время ЦП ("чистое")" для функции
work_run_usrcpu (в данном примере - 5,994). Установите флажок "Показывать только строки", где > Время ЦП ("чистое") == 5,994. Будут отфильтрованы все строки за исключением строки, чистое время для которой равно 5,994.
Обзор использования памяти
Индикатор "Memory Usage" отражает изменение объема памяти для проекта в ходе его выполнения. Этот индикатор используется для определения утечек памяти, то есть мест в программе, в которых неиспользуемая память не освобождается. Утечки памяти могут приводить к повышенному потреблению памяти в программе. Если программа с утечкой памяти выполняется долгое время, то в определенный момент память может закончиться.
- Переместите ползунок времени в мониторе выполнения влево или вправо и обратите внимание на то, как объем кучи памяти уменьшается или увеличивается с течением времени. В данном случае использование памяти четыре раза резко увеличивается. Первые два раза объем использованной памяти возрастает при последовательном выполнении, третий - при параллельном, а четвертый раз - при демонстрации Pthread Mutex.
- Нажмите кнопку "Утечка памяти", чтобы отобразить окно "Детали утечки памяти", в котором отображаются сведения о функциях, допускающих утечки памяти.
В таблице отображаются только те функции, которые вызывают утечку памяти. Если в момент нажатия кнопки программа выполняется, то отображаются только те случаи утечки памяти, которые присутствуют на момент нажатия кнопки. В дальнейшем количество утечек памяти может увеличиться, поэтому необходимо нажать кнопку "Обновить". Если по завершении выполнения утечки памяти не обнаружены, то на вкладке "Детали утечки памяти" отображается сообщение о том, что утечки не обнаружены.
- Для применения фильтра к данным пользователь может изменить начальные и конечные значения времени или использовать оранжевый ползунок подробных сведений в окне монитора выполнения, как описано выше для окна "Время ЦП на функцию".
- В этом случае программа ProfilingDemo обнаружила утечку памяти, связанную с функцией
work_run_getmem.
- Дважды щелкните функцию
work_run_getmem, и файл common.c откроется на строке, на которой в функции возникает утечка памяти.
- Данные об утечке памяти отображаются в левом поле редактора исходного кода. Наведите на них указатель мыши, чтобы получить дополнительные сведения, как было описано выше для данных использования ЦП.
- Щелкните метрики в таблице правой кнопкой мыши для их фильтрации. Подобная фильтрация возможна во всех средствах профилирования.
Обзор использования потоков
Индикатор "Thread Usage" отображает число потоков, используемых программой, а также все моменты времени, в которые поток ожидает получения блокировки, чтобы продолжить выполнение задачи. Эти сведения полезны для многопотоковых приложений, в которых для устранения продолжительного ожидания необходимо выполнение синхронизации потоков.
- Индикатор "Использование потоков" показывает количество потоков, запущенных в ходе выполнения проекта. Перетащите ползунок к началу интервала и обратите внимание на то, что количество потоков равно 1 до момента времени 0:40, а затем увеличивается до 3 потоков.
- Переместите маркер конечной точки ползунка представления на момент времени 0:40, чтобы просмотреть в окне индикатора весь период с 0:00 до 0:40.
- Обратите внимание на индикаторы "Использование ЦП" и "Использование памяти" для этого же периода времени с 0:00 по 0:40 и убедитесь в том, что один поток выполняет операции, использующие время ЦП и память. Этот период соответствует части последовательного выполнения программы, в которой основной поток выполняет запись в файл, а затем, последовательно, выполняет вычисления. Во время ожидания программой нажатия пользователем клавиши Enter интенсивность использования ЦП и памяти снижается, а количество потоков остается равным 1.
- Перетащите ползунок времени вправо для отображения двух точек, в которых количество потоков увеличено до 3.
- Увеличение количества потоков в интервале продолжительностью около 40 секунд соответствует части параллельного выполнения проекта, в которой основной поток запускает два дополнительных потока для параллельного выполнения записи в файл и вычислений. Этот процесс завершается через 50 секунд после начала выполнения программы. Обратите внимание на то, что интенсивность использования памяти и ЦП в этом интервале немного выше, но обе задачи выполняются за значительно меньшее время.
- Количество потоков снова становится равным 1, когда потоки параллельного выполнения завершаются, а основной поток ожидает нажатия кнопки Enter пользователем.
- Количество потоков увеличивается до 3 при запуске части программы Pthread Mutex Demo.
- Обратите внимание на то, что после увеличения количества потоков до 3 возникает ожидание блокировки, которое показано оранжевым цветом. Часть программы Pthread Mutex Demo использует взаимные блокировки исключений для предотвращения перекрывающегося доступа к определенным функциям из нескольких потоков. Это обуславливает ожидание блокировки потоков.
- Нажмите кнопку "Проблемы синхронизации", чтобы просмотреть подробные сведения о блокировках потоков в проекте. Будет открыта вкладка "Подробные сведения о синхронизации потоков", в которой приведены функции, которые ожидали получения блокировки mutex. Также отображаются сведения о длительности ожидания в миллисекундах, а также о количестве пользователей, ожидавших блокировки.
- Если нажать кнопку "Проблемы синхронизации" во время выполнения программы, то следует нажать кнопку обновления слева от столбца "Функция" для обновления сведений о блокировке потоков.
- Щелкните столбец "Wait Time", чтобы отсортировать функции по времени ожидания.
- Щелкните столбец "Lock Waits", чтобы отсортировать функции по количеству случаев ожидания потока в функциях.
- Дважды щелкните функцию
mutex_threadfunc, которой соответствует наибольшее количество ожиданий блокировки. В редакторе откроется файл исходного кода mutex.c на строке, в которой вызвана функция pthread_mutex_lock. Эта функция отвечает за блокировку расположения в памяти перед записью или чтением данного расположения. Она ожидает снятия всех блокировок с памяти.
- Данные о времени ожидания и ожидании блокировки отображаются в левом поле редактора исходного кода. Наведите указатель мыши на данные, чтобы просмотреть подробные сведения, которые совпадают со сведениями, отображаемыми на вкладке "Подробные сведения о синхронизации потоков".
- Щелкните метрики правой кнопкой мыши и удалите флажок "Показать метрики средства профилирования". После этого метрики перестанут отображаться в редакторе исходного кода для всех средств профилирования C/C++.
- Выберите меню "Вид" на строке меню среды IDE и установите флажок "Показать метрики средства профилирования" для повторного отображения метрик.
Данное руководство демонстрирует возможность совместного использования мониторов использования ЦП, памяти и потоков для просмотра событий, происходящих в программе по мере ее выполнения. Если при этом отображение каких-либо индикаторов при выполнении проекта не требуется, их можно отключить. Откройте свойства проекта, выберите категорию "Профиль" и снимите флажок "Показывать индикаторы профилирования во время выполнения".
Управление настройками профиля
Для выбора средств профилирования, отображаемых при выполнении проектов, следует изменить параметры настройки профиля.
Определим пользовательскую настройку профиля для отображения при выполнении проектов C/C++ только средства анализа использования ЦП и памяти.
-
В меню "Средства" выберите команду "Средства профилирования" для открытия диалогового окна "Диспетчер средств профилирования".
- В списке "Настройки средства профилирования" выберите элемент "Управление настройками".
- В диалоговом окне "Диспетчер настроек средства профилирования" выберите элемент "Sun Studio для C/C++, стандартная версия".
- Нажмите кнопку "Дублировать".
- Нажмите кнопку "Переименовать" и введите имя "ЦП/память SunStudio", а затем нажмите кнопку "ОК".
- Нажмите кнопку "ОК" в диалоговом окне "Диспетчер настроек средств профилирования".
- В диалоговом окне "Диспетчер средств профилирования" выберите новую настройку "ЦП/память SunStudio".
- Снимите флажок для средства "Использование потоков" в списке средств и нажмите кнопку "ОК".
- Для выбора этой настройки щелкните узел проекта правой кнопкой мыши и выберите пункт меню "Свойства".
- В диалоговом окне "Свойства проекта" выберите категорию "Профиль".
- Выберите настройку профиля "ЦП/память SunStudio" и нажмите кнопку "ОК".
- Запустите проект. Средства анализа использования ЦП и памяти будут отображены в окне "Монитор выполнения".
Дополнительные сведения
Средство анализа объема ввода-вывода описано в разделе Профилирование ввода-вывода для проектов C/C++ в операционных системах Solaris
Средство анализа микросостояний потоков описано в разделе Использование средства анализа микросостояний потоков в операционных системах Solaris.
Заключение
В этом учебном курсе продемонстрированы следующие сведения о средствах профилирования C/C++:
- Сбор сведений профилирования в системах Linux осуществляется с помощью программного обеспечения Sun Studio, а на платформах Solaris – с помощью ПО Sun Studio или средства Solaris DTrace по выбору пользователя
- Графическая информация профилирования отображается на вкладке "Монитор выполнения"
- При нажатии кнопки в индикаторе выводятся более подробные сведения о функциях программы
- Щелчок по функциям на вкладках подробной информации открывает файл исходного кода на строке, в которой вызывается функция
- Параметры профилирования расположены в категории "Profile" свойств проекта
- Профилирование можно отключить в свойствах проекта
- Выбор средств профилирования осуществляется в настройках профиля
- Если в сети установлена система под управлением Linux или Solaris, то возможно использование средств профилирования на компьютере под управлением Windows или Mac. Для этого необходимо настроить систему Linux или Solaris в качестве узла удаленного управления для сборки и выполнения проектов
|
|