Разработчик(и) | Интел |
---|---|
Стабильный релиз | 3.31 / 30 июня 2024 г. ( 2024-06-30 ) |
Операционная система | Linux , Windows , MacOS |
Платформа | IA-32 , x86-64 , Intel Xeon Phi |
Тип | Инструментарий , Профайлер |
Лицензия | Запатентованный , PIN-код предоставляется бесплатно для любого использования в соответствии с упрощенной лицензией Intel на программное обеспечение . |
Веб-сайт | www.intel.com/software/pintool |
Pin — это платформа для создания инструментов анализа. Инструмент pin включает в себя процедуры инструментирования, анализа и обратного вызова . Процедуры инструментирования вызываются, когда код, который еще не был перекомпилирован, должен быть запущен, и позволяют вставлять процедуры анализа. Процедуры анализа вызываются, когда запускается связанный с ними код. Процедуры обратного вызова вызываются только при выполнении определенных условий или при возникновении определенного события. Pin предоставляет обширный интерфейс прикладного программирования (API) для инструментирования на разных уровнях абстракции, от одной инструкции до целого двоичного модуля. Он также поддерживает обратные вызовы для многих событий, таких как загрузка библиотек, системные вызовы, сигналы/исключения и события создания потоков.
В 2020 году он получил премию Programming Languages Software Award от ACM SIGPLAN . [1]
Pin выполняет инструментирование, беря под контроль программу сразу после ее загрузки в память. Затем точно в срок перекомпилирует (JIT) небольшие разделы двоичного кода с помощью pin непосредственно перед его запуском. Новые инструкции для выполнения анализа добавляются к перекомпилированному коду. Эти новые инструкции поступают из Pintool. Большой набор методов оптимизации используется для получения минимально возможного времени выполнения и накладных расходов на использование памяти. По состоянию на июнь 2010 года средние базовые накладные расходы Pin составляют 30 процентов (без запуска pintool). [2]
Pin поддерживает два режима инструментирования, называемые режимом JIT и режимом Probe. Режим JIT поддерживает все функции Pin, в то время как режим Probe поддерживает ограниченный набор функций, но работает намного быстрее, практически не добавляя накладных расходов к времени выполнения программы. Режим JIT использует компилятор just-in-time для перекомпиляции всего программного кода и вставки инструментирования, в то время как режим Probe использует трамплины кода для инструментирования.
Pin был разработан для переносимости инструмента , и несмотря на JIT-компиляцию из одной ISA в ту же ISA (и не используя единое промежуточное представление для всего кода), большинство его API не зависят от архитектуры и операционной системы . Он также был разработан так, чтобы быть переносимым, тщательно изолируя платформенно-зависимый код от универсального кода, что позволяет быстро адаптировать Pin к новым платформам. Примерно половина кода является универсальной, а остальная часть зависит либо от архитектуры, либо от ОС. [3]
Pin использует множество методов для оптимизации кода инструментирования и анализа, используя такие методы, как встраивание , анализ жизнеспособности и интеллектуальное выталкивание регистров . Pin выполняет эти оптимизации автоматически, когда это возможно, без необходимости для пользователей вставлять какой-либо дополнительный код для встраивания. Естественно, некоторые оптимизации по-прежнему требуют подсказок пользователя, и некоторые структуры кода легче встраивать, чем другие. Также используются прямая ссылка на разделы кода, сжатые с помощью jit, метод, называемый трассировкой связывания , и согласование привязки регистров , которое минимизирует выталкивание и переназначение регистров.
API и реализация Pin нацелены на то, чтобы сделать инструменты pin простыми в написании. Pin полностью отвечает за то, чтобы код инструментирования из инструмента pin не влиял на состояние приложения. Кроме того, API позволяет коду инструментирования запрашивать множество фрагментов информации из Pin. Например, код инструментирования в инструменте pin может использовать API Pin для получения адреса памяти, к которому обращается инструкция, без необходимости подробного изучения инструкции.
Существует множество Pintools, которые используются для различных задач.
Существует множество других инструментов для сбора данных об использовании ресурсов запущенных программ в системе, например, инструмент Strapon от Bell Lab и инструмент Dyninst и т. д. Инструмент Bell Lab использует технологию Strap On, которая запускает инструмент для сбора ресурсов одновременно с программой, но этот инструмент совместим только с программами, которые позволяют другим программам работать одновременно с ними. [6] Кроме того, инструмент Dyninst использует двоичную перезапись исполняемых и реализуемых команд программы внутри программы для проверки использования ресурсов и является очень эффективным. Однако он очень нестабилен, поскольку является относительно новым инструментом и дает сбой в крупных программах. [7] Наконец, инструмент Intel Pin использует статическую двоичную инструментацию и запускает программу как часть себя, отслеживая все ее ресурсы. [8] Этот подход больше подходит для антивируса, поскольку он может легко запускать все процессы под собой и может завершать программы, если они достигают максимального выделенного предела, определенного антивирусом.