СПОСОБ ТРАССИРОВКИ ВЫЗОВОВ БИБЛИОТЕК
METHOD FOR ROUTING OF LIBRARY CALLS

Изобретение относится к области обработки цифровых данных с помощью электрических устройств, к устройствам функционального тестирования, а именно к способам трассировки вызовов библиотек, и может применяться для сбора статистических данных о вызовах функций из библиотек в приложении (программе) для встроенной компьютерной системы.
Обычные приложения для встроенных систем используют динамически компонуемые библиотеки для выполнения стандартных операций или действий, которые могут потребоваться в других приложениях. Для оптимизации порядка расположения функций в библиотеках применяют способы трассировки вызовов библиотек, в которых производят сбор данных о вызовах функций из библиотек. Собранные данные могут быть использованы для улучшения порядка расположения вызовов функций или улучшения порядка расположения вызовов функций в библиотеках или других приложениях, которым требуются данные о порядке расположения функций.
Приложения, в которых применяют динамически компонуемые библиотеки для трассировки вызовов функций, традиционно используют динамический компоновщик. Динамический компоновщик вычисляет адреса функций для применения в приложении. Сама динамическая библиотека отображается в адресное пространство приложения и становится пригодной для загрузки в произвольный адрес.
Как правило, если приложение (Фиг.1) вызывает функцию из динамически компонуемой библиотеки, то в ответ получает действительный адрес функции из специальной таблицы, которая содержит адреса функции в адресном пространстве приложения. Обычно данная таблица называется Global Offset Table (GOT) и заполняется динамическим компоновщиком. Для уменьшения времени начальных вычислений адресов для GOT динамический компоновщик вычисляет их в момент первого вызова функции. Эта технология называется «ленивая компоновка» ("lazy linking"). Основы этой технологии изложены в следующих публикациях: Phillip W.L. Fong, et al., "Proof Linking: An Architecture for Modular Verification of Dynamically-Linked Mobile Code" School of Computing Science, Simon Fraser University, B.C., Canada, Sigsoft, Nov. 1998, pp.222-230. [1]. Luca Cardelli, "Program Fragments, Linking, and Modularization" Digital Equipment Corporation, System Research Center, POPL 97, Paris France. [2], Sheng Liang, et al., Dynamic Class Loading in the Java.TM. Virtual Machine Sun Microsystems, Inc. OOPSLA 10/98, Vancouver, B.C. [3].
В известных способах трассировки с использованием динамического компоновщика выполняют следующие действия. Сначала активируют динамический компоновщик. Компоновщик извлекает имя вызванной функции и вычисляет ее адрес. Затем этот адрес помещают в таблицу адресов вместо адреса функции входа в динамический компоновщик.
Наиболее близким к заявленному является способ трассировки событий входа в динамическую библиотеку и выхода из нее, описанный в патенте США №5946486 [4]. В этом патенте предложено устройство и способ трассировки событий, происходящих при входе в (или выходе из) библиотеку динамических связей (dynamic link library - DLL) без доступа или изменения исходного кода DLL. Этот способ предусматривает также создание «теневой» библиотеки динамических связей, предназначенной для перехвата запроса, поступающего из выполняемой программы.
Данный способ выбран в качестве прототипа заявленного изобретения.
Недостаток способа-прототипа заключается в необходимости использования скрытой («теневой») библиотеки, которая заменяет реальную библиотеку, что уменьшает быстродействие способа и увеличивает загруженность аппаратных ресурсов системы в случае большого числа библиотек и приложений.
Задачей, которая решается заявленным изобретением, заключатся в разработке способа трассировки вызовов библиотек с увеличенным быстродействием и сниженной загрузкой аппаратных ресурсов системы. Поставленная задача решена путем создания способа трассировки вызовов библиотек, заключающегося в выполнении следующих операций:
- выполняют активацию динамического компоновщика с сохранением целостности трассируемой программы,
- извлекают информацию об имени вызванных функций,
- извлекают информацию о последовательности вызова функций,
- осуществляют запись информации о последовательности компоновки функций в блоке памяти,
- осуществляют запись информации о вызванных функциях в блоке памяти.
Таким образом, технический результат достигается за счет сбора данных о вызовах функций при помощи динамического компоновщика времени выполнения без рекомпиляции модуля приложения или выполнения каких-либо действий с ним и при этом сохранения данных в любом доступном в системе средстве хранения данных, таком как флэш-память или ОЗУ. Этим обеспечивают повышение эффективности способа трассировки вызова библиотек и уменьшение загрузки аппаратных ресурсов.
Для лучшего понимания заявленного изобретения далее приводится его подробное описание с соответствующими чертежами.
Фиг.1 Схема выполнения трассировки вызовов библиотек с использованием динамического компоновщика, известная из уровня техники.
Фиг.2 Пошаговая схема выполнения способа трассировки с использованием динамического компоновщика, выполненная согласно изобретению.
Фиг.3 Схема системы трассировки вызовов библиотек с использованием динамического компоновщика, выполненная согласно изобретению.
В заявленном способе трассировки вызовов библиотек (см. Фиг.2) сначала активируют динамический компоновщик (шаг 1). Затем извлекают информацию об имени вызванной функции (шаг 2). Вычисляют адреса вызванной функции (шаг 3). Сохраняют данные о вызванной функции (шаг 4). Помещают адреса в таблицу адресов (шаг 5).
Компьютерная система (Фиг.3), в которой выполняют заявленный способ трассировки вызовов библиотек, содержит несколько компонентов. В их число входят библиотека 1 функций и непосредственно функциональный модуль 2, а также динамический компоновщик 3 и таблица 4 адресов, которые связаны с функциональным модулем 2. В заявленном способе динамический компоновщик 3 представлен модулем, который может произвести динамическую компоновку и сохранить данные об их порядке.
Когда приложение пытается выполнить динамически компонуемую функцию, оно получает адрес от таблицы GOT, соответствующий необходимой функции. До определения непосредственного адреса функции данная таблица содержит адреса входной функции динамического компоновщика. После входа во входную функцию динамический компоновщик получает адрес вызванной функции и связывает его с именем вызванной функции. На данной стадии компоновщик может использовать эти данные для сбора статистики.
Заявленное изобретение использует известное в данной области техники свойство сбора данных о порядке вызовов функций. Замена стандартного динамического компоновщика на модуль позволяет собирать данные о первых вызовах функций библиотек. Используемый в заявленном изобретении динамический компоновщик-модуль собирает данные о всех вызовах библиотек, при этом не снижается производительность при прямой инструментации.
Заявленный способ имеет несколько преимуществ. В нем выполняется сбор данных для всех приложений и всех библиотек встроенной системы. В нем не требуется рекомпиляции модуля приложения. В нем производится меньше операций, чем при инструментации, поскольку используется трассировка только первого вызова.
Система трассировки вызовов библиотек с использованием динамического компоновщика, в которой выполняется заявленный способ, может быть применена практически во всех компьютерных системах, в которых используются динамически компонуемые библиотеки, а также во встроенных системах с применением файлового формата ELF для сортировки библиотек и функциональных модулей. Для сортировки данных о последовательности вызовов может использоваться флэш-память или загруженное в память приложение.
Хотя указанный выше вариант выполнения изобретения был изложен с целью иллюстрации настоящего изобретения, специалистам ясно, что возможны разные модификации, добавления и замены, не выходящие из объема и смысла настоящего изобретения, раскрытого в прилагаемой формуле изобретения.