Библиотека сайта rus-linux.net
На главную -> MyLDP -> Программирование и алгоритмические языки
Ulrich Drepper "Как писать разделяемые библиотеки" | ||
Назад | Оглавление | Вперед |
2.7. Простое профилирование интерфейса
Динамический компоновщик, имеющийся в библиотеке GNU C, позволяет легко без перекомпиляции кода выполнять профилирование объекта DSO. Если в переменной среды окружения LD PROFILE установить значение, совпадающее с именем разделяемого объекта (SONAME), указываемого в DSO, то будут записываться все обращения к интерфейсу в этом DSO , которые осуществляются через таблицу PLT. В добавок, будет записываться выборка значений, осуществляемая с определенным временным интервалом, а также все то, что происходило в профилируемом объекте DSO. Все это похоже на профилирование на с использованием программы gprof, которая имеется в системах Unix уже в течение длительного времени.
В переменной LD PROFILE можно указать любое количество приложений, работающих одновременно. Вся профилируемая активность записывается в режиме реального времени в один и тот же выходной файл, который обычно хранится в /var/tmp. Можно, не останавливая профилируемые приложения, проверить их текущее состояние, запустив для этого программу sprof. Параметры, используемые в программе sprof, аналогичны тем, что используются с программой gprof. Имеются три основных вида отчетов — пары вызова (call pairs), непрерывное профилирование (flat profiles) и графические профили, причем все три вида отчетов можно делать сразу.
Как использовать результаты такого профилирования, зависит от конкретного приложения. Просто будет найти часто вызываемые функции, и, если задать достаточное время выполнения, функций внутри объектов DSO, которые работают долго. Те, кто пользовался gprof, почувствуют себя как дома, хотя профилирование объектов DSO имеет свои ограничения.
Данные о вызовах накапливается при помощи перехвата обращений, делаемых через таблицу PLT. Динамический компоновщик может это делать без уведомления об этом приложения. Но если PLT не используется, то данные не записываются. Это случай, когда в приложении с помощью dlsym выполняется поиск символа, расположенного ранее, а затем происходит прямое к нему обращение. Это может сделать профилирование данных бесполезным.
Решение этой проблемы состоит в использовании макроса DL CALL FCT, в котором определен заголовок <dlfcn.h> библиотеки GNU C. Если найденный указатель функцию fctp должен использоваться следующим образом
foo = fctp (arg1, arg2);
или, если предпочитаете, следующим образом
foo = (*fctp) (arg1, arg2);
то код должен быть переписан, например, следующим образом:
foo = DL CALL FCT (fctp, (arg1, arg2));
В макросе DL CALL FCT находятся магические средства, необходимые для записи обращения к функции, на которую указывает fctp. Если DSO, в котором находится этот символ, не профилируется, то ничего не происходит. Поэтому в динамически загружаемых DSO этот макрос можно всегда использовать для вызова символов. Накладные расходы использования макроса DL CALL FCT низки и, поэтому его можно использовать без всяких ограничений, но, когда создается код, этого, вероятно, лучше избегать.
Предыдущий раздел: | Следующий раздел: | |
Назад | Оглавление | Вперед |