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

Способ динамической инструментации пользовательских приложений в компьютерной системе, по меньшей мере, с одним процессором, выполненной с возможностью взаимодействия с памятью и включающей в себя операционную систему, взаимодействующую с данным процессором, при этом операционная система выполнена с возможностью работы в пространстве ядра и выполнения действия по запросу одной или более пользовательских программ; процессор выполнен с возможностью выполнения процедуры вызова подпрограммы путем сохранения адреса возврата во временное хранилище при вызове подпрограммы; операционная система выполнена с возможностью использования механизма загрузки страниц памяти по запросу, содержащий следующие операции:
конфигурируют компьютерную систему;
вставляют первую инструкцию-исключение по адресу из пользовательского адресного пространства, при запросе на трассировку вызова или возврат из подпрограммы одной из пользовательских программ, при этом данный адрес является точкой входа наблюдаемой подпрограммы;
вставляют вторую инструкцию-исключение по адресу из пользовательского адресного пространства, при запросе трассировать вызов или возврат из подпрограммы одной из пользовательских программ, при этом данный адрес является адресом инструкции, следующей за точкой входа наблюдаемой процедуры;
запоминают адрес возврата вызванной подпрограммы и заменяют данный адрес возврата адресом второй инструкции-исключения;
передают контроль ядру от первой инструкции-исключения при вызове данной подпрограммы;
обработчик инструментации выполняется в ядре операционной системы при вызове пользовательской подпрограммы и в результате передают контроль по адресу первой инструкции-исключения;
передают контроль ядру от второй инструкции-исключения при возврате из данной подпрограммы;
обработчик инструментации выполняется в ядре операционной системы при возврате из пользовательской подпрограммы и в результате передают контроль по адресу второй инструкции-исключения;
удаляют первую инструкцию-исключение при возникновении запроса на остановку наблюдения за вызовами функции и при остановке наблюдения за возвратом из функции;
- удаляют вторую инструкцию-исключение при возникновении запроса на остановку наблюдения за возвратом из функции;
отличающийся тем, что
добавляют в ядро операционной системы хранилище для данных о пользовательских подпрограммах, которые должны быть инструментированы;
получают адреса пользовательских подпрограмм для инструментации из таблиц символов бинарных файлов, которые должны быть инструментированы, и сохраняют эти адреса в хранилище из предыдущего пункта;
инструментируют обработчик do_page_fault для наблюдения за возвратом из него; обработчик наблюдения вызывается каждый раз, когда происходит возврат из do_page_fault;
ищут в хранилище данных подпрограммы, точки входа которых находятся на странице памяти, загруженной обработчиком do_page_fault, когда do_page_fault вызывается для приложения, которое должно быть инструментировано;
инструментируют обработчик do_exit для наблюдения за его вызовом; обработчик наблюдения вызывается каждый раз, когда происходит вызов do_exit;
запрашивают удаление всей установленной инструментации, когда вызывается обработчик наблюдения за вызовом do_exit;
инструментируют send_signal для наблюдения за его вызовом; обработчик наблюдения вызывается каждый раз, когда происходит вызов send_signal;
запрашивают удаление всей установленной инструментации, когда вызывается обработчик наблюдения за вызовом send_signal;
проверяют, выполняется ли все еще подпрограмма, когда получен запрос на останов наблюдения за возвратом из нее;
если условие из предыдущего пункта выполняется, откладывают удаление кода инструментации до возврата из подпрограммы и удаляют его, когда происходит возврат из функции;
не изменяют адрес возврата при вызове подпрограммы с отложенным удалением кода инструментации.