Самый простой способ собрать динамическое количество выполнений команд?

Я хотел бы получить простой и быстрый способ собрать количество раз, когда каждая инструкция в битовом коде LLVM выполнялась при данном запуске приложения. Насколько я могу судить, существует несколько подходов:

  • Используйте PIN-код. Это потребует использования информации отладки DWARF и информации отладки инструкций, чтобы попытаться отобразить инструкции в двоичном файле в инструкции в битовом коде; не уверен на 100%, насколько точно это будет.

  • Используйте llvm-prof. Два вопроса здесь. Во-первых, я видел в переполнении стека опцию opt называется --insert-edge-profiling, Тем не менее, эта опция не доступна в версии 3.6? Во-вторых, похоже, что такое профилирование только учитывает выполнение записей на уровне функций, а не на уровне отдельных инструкций. Это верно?

  • Написать новый инструмент, похожий на AddressSanitizer. Это может сработать, но кажется излишним.

Есть ли более простой способ достижения моей цели, который я пропускаю?

1 ответ

Решение

В рамках своей докторской диссертации я написал инструмент для сбора информации об основных блоках, выполняемых программой. Этот инструмент также записывает количество инструкций LLVM в каждом базовом блоке, поэтому анализ трассы даст динамическое число выполнений инструкций.

Другой инструмент исследования - Гармония. Он предоставит динамический счетчик выполнения каждого базового блока в программе, который вы можете дополнить статическим счетчиком команд.

В противном случае, я бы предложил написать свой собственный инструмент. Для каждого базового блока (атомарно) увеличивайте глобальный счетчик на количество инструкций в этом блоке.

Другие вопросы по тегам