СПОСОБ ДИНАМИЧЕСКОЙ ИНСТРУМЕНТАЦИИ
DYNAMIC INSTRUMENTATION TECHNIQUE

Изобретение относится к области вычислительной техники, а именно к способам динамической инструментации, и может быть применено во встроенных системах для инструментации тел функций программы, выполняемой в системе, с целью точного мониторинга поведения системы или как отдельный модуль для сбора полной информации о глобальных структурах, аргументах функций, возвращаемых значениях и локальных переменных в каждой точке выполнения функции во время выполнения программы в системе.
В общепринятых способах трассировки данных, обрабатываемых во время выполнения программы, используют программный код, печатающий отладочную информацию, который разработчики вставляют в исходный текст программы, чтобы понять поведение программы. Однако в таком способе программу необходимо перекомпилировать, а это требует времени.
Другие способы, а именно способы, основанные на динамической инструментации, позволяют собирать информацию во время выполнения программы без ее перекомпиляции и перезапуска, что существенно уменьшает время разработки. Некоторые существующие технологии динамической инструментации не позволяют собирать информацию о локальном контексте выполнения программы, например такие данные, как значения локальных переменных, а другие способы, позволяющие собирать такие данные, предъявляют к ресурсам системы требования, которые могут быть неприемлемыми для встроенных систем.
Исполняемый бинарный код является надежным источником информации о содержимом и поведении программы. Компиляция, линковка и оптимизация программы может привести к появлению существенных отличий в поведении программы от ее исходного кода. Способ, который позволяет получить информацию о переменных в программе во время ее выполнения, используя только бинарный код, очень полезен. Он дает возможность анализировать поведение программы без рекомпиляции, что сокращает время разработки программы.
Как правило, существующие способы динамической инструментации позволяют собирать информацию о глобальных данных, аргументах функций и возвращаемых значениях, поскольку данная информация может быть получена из бинарного кода. Получение значений локальных переменных является более сложной задачей, поскольку при извлечении информации о локальной переменной из бинарного кода возникают некоторые проблемы, в случае когда информация для отладки изъята при высоком уровне оптимизации бинарного кода.
Существующие технологии динамической инструментации позволяют собирать информацию практически в каждой инструкции, но, несмотря на это, существует проблема идентификации переменной, сохраненной в регистре или на стеке. Другими словами, не сложно собрать полную информацию о выполнении программы, но сложно понять, что означает данная информация.
Если бинарный файл содержит отладочную информацию, то мы имеем достаточно информации о соответствии исходного кода бинарному коду. Таким образом, мы можем трассировать информацию о данных в программе, если мы имеем отладочную информацию в бинарном коде.
Если бинарный код не содержит отладочную информацию, при определении соответствия между исходным кодом и бинарным кодом для локальных переменных возникнут проблемы.
Существует серьезная проблема сбора информации из файлов с неполной бинарной информацией. Неполные бинарные файлы являются выполняемыми файлами без информации о местах нахождения, размерах и формате функций и объектов. Данная информация обычно содержится в генерируемых компилятором таблицах символов. Коммерческие программы, как правило, не содержат такой информации во избежание стороннего инженерного анализа и нелицензированного использования программ. Системные библиотеки и утилиты тоже зачастую не имеют такой информации, чтобы уменьшить требования к свободному пространству на диске.
Система Dynlnst (см., например, http://www.dyninst.org/) [1] позволяет генерировать и динамически вставлять куски бинарного кода в выполняющуюся программу. Она может трассировать глобальные и локальные переменные путем генерации и вставки трассирующего кода в программу. Недостаток системы [1] заключается в том, что для ее функционирования необходимо наличие отладочной информации в инструментизируемых бинарных файлах, что сильно увеличивает размер этих файлов.
Известен способ трассировки данных в программе, предложенный в патенте США № 5,870,606 [2], в котором для каждого подлежащего трассировке элемента данных предлагают использовать прокси-объекты. Прокси-объекты перехватывают сообщения, посланные программой этим элементам данных. Такой способ имеет следующие недостатки:
- Требует изменения исходного кода, перекомпиляции и перезапуска программы для выполнения трассировки.
- В связи с необходимостью использования специальных прокси-объектов данный способ дополнительно перегружает память. Это может быть неприемлемо для встроенных систем.
- Данный способ не применим для определения ситуаций, в которых переменную случайно перезаписывают неверным кодом (переполнение буфера и т.д.).
В другом патенте США (см. № 5,347,649) [3] предложен способ, заключающийся в том, что вставляют дополнительный код в функции обработки данных для трассировки изменений данных. Такой способ имеет следующие недостатки:
- Требует изменения исходного кода, перекомпиляции и перезапуска программы для выполнения трассировки.
- Сложно применить данный способ для трассировки данных основных типов, таких как 1, 2 и 4-байтные переменные.
- Данный способ не применим для определения ситуаций, в которых переменную случайно перезаписывают неверным кодом (переполнение буфера и т.д.).
Наиболее близким к заявленному изобретению является способ трассировки данных в программе, который описан в патенте США № 6,769,117 [4]. Этот способ основан на динамической инструментации, что позволяет собирать аргументы и возвращаемые значения функций ядра, а также информацию о глобальных структурах ядра. Однако он не обеспечивает возможности сбора информации о локальных переменных.
Предложенный способ позволяет заменить метод вставки отладочного вывода, поскольку в нем собирают всю информацию о выполнении программы в любой момент ее выполнения. Предложенный способ позволяет осуществлять мониторинг следующих бинарных файлов:
- файлов с отладочной информацией;
- файлов без отладочной информации;
- файлов с неполной бинарной информацией.
Задача, на решение которой направлено заявляемое изобретение, состоит в разработке усовершенствованного способа динамической инструментации, позволяющего собирать информацию о локальном контексте выполнения программы из функций во время выполнения программы. При этом собираемая информация должна включать в себя следующие данные: глобальные структуры, аргументы функций, возвращаемые значения, локальные и глобальные переменные.
Технический результат достигают за счет создания способа динамической инструментации в компьютерной системе, содержащей главную систему, связанную с устройством, по меньшей мере, один процессор, связанный с памятью, а также операционную систему, которая связана с процессором и выполнена с возможностью функционирования в пространстве ядра и выполнения операции по команде одной или нескольких пользовательских программ, при этом процессор выполнен с возможностью осуществления действий для выполнения процесса сохранения локальных переменных, путем сохранения их значений в регистрах или в стеке, в котором выполняют следующие операции:
- конфигурируют компьютерную систему;
- компилируют исследуемую программу с информацией об отладке в главной системе;
- вставляют контрольную точку при поступлении запроса мониторинга переменной по определенному адресу;
- переводят управление системы в режим ядра, когда при выполнении программы достигают контрольной точки;
- выполняют подпрограмму инструментации в пространстве ядра;
- считывают значение переменной, которое хранится в регистре процессора или в пространстве пользователя в памяти;
- пересылают значение переменной в программу трассировки;
- продолжают выполнение исследуемой программы;
при этом между операциями компиляции исследуемой программы и вставки контрольной точки дополнительно выполняют следующие операции:
- извлекают адрес и информацию о переменной из бинарного кода с отладочной информацией в главной системе, при этом отделяют отладочную информацию от бинарного кода и уменьшают объем отладочной информации путем выбора из нее только необходимой информации;
- посылают извлеченную информацию программе трассировки на устройстве, при этом пользователь передает извлеченную информацию об адресах инструкций (адреса контрольных точек), месте расположения переменных и их размерах по назначению, а программа трассировки, используя уменьшенную отладочную информацию, задает контрольные точки и собирает данные из бинарного кода без отладочной информации во время выполнения программы.
Как видно из вышеизложенного, основная идея заявляемого способа заключается в использовании отладочной информации для мониторинга бинарных файлов нескольких типов. Другими словами, в нем тем или иным образом получают отладочную информацию (например, отладочная информация может быть в отдельном файле) и затем осуществляют мониторинг файлов. В предложенном способе с помощью отладочной информации извлекают информацию о типах переменных программы, месте нахождения переменных, а также о соответствии между строками исходного кода и инструкциями бинарного кода, а затем получают информацию из бинарного кода во время выполнения программы.
Заявляемый способ динамической инструментации отличается от прототипа [4] уменьшенным объемом ресурсов (памяти) компьютерной системы, занимаемых при выполнении данного способа, за счет того, что для его выполнения не требуется отладочная информации инструментируемых бинарных файлов, а необходима только та отладочная информация, которая будет использована непосредственно для мониторинга программы, и с увеличенным быстродействием за счет того, что мониторинг программы производят во время ее выполнения и без перезагрузки системы.
Для функционирования заявляемого способа имеет смысл, чтобы уменьшали объем отладочной информации, выбирая из нее только необходимую информацию, а именно: адреса инструкции, которая соответствует строке исходного кода (контрольной точке), места расположения переменной (переменная может быть занесена в стек, регистр или память) и размер переменной.
Для функционирования предложенного способа имеет смысл, чтобы дополнительно уменьшали объем отладочной информации, выбирая из нее информацию по конкретному запросу пользователя (пользователь может запросить информацию о переменных с определенными именами).
Для лучшего понимания заявляемого изобретения далее приводится его подробное описание с соответствующими чертежами.
Фиг.1. Общая схема компьютерной системы для выполнения способа динамической инструментации согласно изобретению.
На данном чертеже показан общий вид системы, в которой может использоваться предложенный способ. Программу без отладочной информации пересылают на устройство, на котором она будет работать. Специальная программа извлекает необходимую отладочную информацию из бинарного файла с отладочной информацией. Извлеченную часть информации об отладке передают в программу трассировки на устройстве.
Фиг.2. Схема трассировки данных в способе динамической инструментации согласно изобретению.
На данном чертеже показана трассировка данных в программе. Пользователь передает в программу трассировки данные о месте расположения информации об отладке. Затем он указывает имя переменной и указывает, где должна осуществляться ее трассировка. Программа трассировки определяет адрес для трассировки и место расположения переменной и передает данную информацию в модуль инструментации. Модуль инструментации устанавливает контрольную точку. Когда программа достигает контрольной точки, вызывают хук модуля инструментации, который получает значение переменной и передает его в программу трассировки.
Фиг.3. Схема пошагового выполнения способа динамической инструментации согласно изобретению.
В общем случае заявляемый способ динамической инструментации выполняют следующим образом (Фиг.1-2). Создают бинарный файл с информацией об отладке в главной системе (Хост). Извлекают информацию о типе переменной, о месте расположения переменной (стек, регистры или память), о соответствии между строками исходного и инструкциями бинарного кода. Пересылают извлеченную информацию в программу трассировки на устройстве. В устройстве выполняют инструментацию, при этом вставляют точки инструментации в функцию программы. Собирают информацию о значениях переменных в данной точке инструментации во время выполнения программы.
Рассмотрим подробное пошаговое выполнение предложенного способа (Фиг.1-3). Сначала конфигурируют компьютерную систему, по меньшей мере, с одним процессором, связанную с памятью. При этом компьютерная система содержит операционную систему, которая связана с процессором, данная операционная система работает в пространстве ядра и выполняет операции по команде одной или нескольких пользовательских программ, процессор выполняет действия для осуществления процесса сохранения локальных переменных, путем сохранения их значений в регистрах или в стеке (шаг 1). Затем компилируют исследуемую программу с информацией об отладке в главной системе (шаг 2). Извлекают адрес и информацию о переменной из бинарного кода с отладочной информацией в главной системе (шаг 3). На данном шаге отделяют отладочную информацию от бинарного кода и уменьшают ее объем путем выбора только нужной информации. Уменьшение объема отладочной информации достигается, в частности, путем выбора из всей информации об отладке только следующей информации: адреса инструкции, которая соответствует строке исходного кода (контрольной точке), места расположения переменной (переменная может быть занесена в стек, регистр или память) и размера переменной. Дополнительное уменьшение объема отладочной информации достигается путем выбора информации по специальному запросу пользователя (пользователь может запросить информацию о переменных с определенными именами). Кроме того, наличие данного шага позволяет использовать предложенный способ для встроенных систем в условиях ограниченных ресурсов. Посылают извлеченную информацию в программу трассировки на устройстве (шаг 4). На данном шаге пользователь передает извлеченную информацию об адресах инструкций (адреса контрольных точек), месте расположения переменных и их размерах по назначению. Программа трассировки использует уменьшенную отладочную информацию для задания контрольных точек и сбора данных из бинарного кода без отладочной информации во время выполнения исследуемой программы. Вставляют контрольную точку при поступлении запроса мониторинга переменной по определенному адресу (шаг 5). Переводят управление в режим ядра, когда при выполнении программы достигают контрольной точки (шаг 6). Выполняют подпрограмму инструментации в пространстве ядра (шаг 7). Считывают значение переменной, которое хранится в регистре процессора или в пространстве пользователя в памяти (шаг 8). Пересылают значение переменной в программу трассировки (шаг 9). Продолжают выполнение исследуемой программы (шаг 10).
Хотя указанный выше вариант выполнения изобретения был изложен с целью иллюстрации настоящего изобретения, специалистам ясно, что возможны разные модификации, добавления и замены, не выходящие из объема и смысла настоящего изобретения, раскрытого в прилагаемой формуле изобретения.