Счетчик выполнения ассемблерных инструкций x86

Привет всем, у меня есть код, и я хочу найти, сколько раз выполняется каждая сборочная линия. Мне все равно, через профилирование или эмуляцию, но мне нужны высокоточные результаты. Однажды я наткнулся на форум, где давался какой-то скриптовый код для этого, но я потерял ссылку. Может ли кто-нибудь помочь мне провести мозговой штурм, как это сделать? С Уважением

Редактировать: Хорошо, я думаю, что на полпути. Я провел некоторое исследование BTS (Branch Trace Store), предоставленного Intel Manual 3A, раздел 16.4.5, в соответствии с одним из сообщений. Эта функция обеспечивает историю ветвей. Так что теперь мне нужна ваша помощь, чтобы найти какие-либо сценарии или инструменты с открытым исходным кодом для этого. Ожидание проверки вашего отзыва

ура=)!


person Syntax_Error    schedule 25.12.2010    source источник


Ответы (3)


Если ваш процессор поддерживает это, вы можете включить Branch Trace Store (BTS). BTS хранит журнал всех принятых ветвей в предопределенной области памяти. Каждая запись содержит источник и место назначения ветви. Используя это, вы можете подсчитать, сколько раз вы были в каждом сегменте кода.

Посмотрите том 3A документа Руководство разработчика программного обеспечения Intel, раздел 16.4.5 (в текущей редакции), чтобы узнать, как его включить.

person Nathan Fellman    schedule 25.12.2010
comment
это звучит интересно! знаете ли вы какое-либо программное обеспечение, которое его использует, или мне нужно самому его кодировать? но все же я думаю, что этого будет недостаточно, потому что я буду пренебрегать условными операторами! - person Syntax_Error; 26.12.2010
comment
@Syntax: я не знаю, есть ли какие-либо пакеты, которые его реализуют. Какими условными утверждениями вы бы пренебрегли? - person Nathan Fellman; 26.12.2010
comment
если у вас есть код операции cmova, это условное перемещение, поэтому оно будет выполнено только в том случае, если будут подняты правильные флаги. поэтому, даже если он находится внутри функции, он не всегда будет выполняться - person Syntax_Error; 26.12.2010
comment
@Syntax: он всегда будет выполняться. У вас нет возможности подсчитать инструкции, которые будут пропускать условные ходы, в которых условие не выполняется. - person Nathan Fellman; 26.12.2010
comment
Звучит здорово, я постараюсь найти пакеты, которые читают BTS... если найдете, дайте мне знать! - person Syntax_Error; 26.12.2010

Если вас не волнует производительность, вы можете сделать небольшой трюк, чтобы подсчитать ее. Поднимите одношаговое исключение и после входа в свой собственный обработчик seh поднимите еще одно и перейдите к следующей команде.

Возможно, некоторые инструменты профилировщика, такие как pin или valgrind, сделают это за вас более простым способом. Я бы посоветовал вам взглянуть.

person Spyros    schedule 25.12.2010
comment
Я посмотрю на булавку! ты использовал это be4? - person Syntax_Error; 26.12.2010
comment
я не использовал его экстенсивно, но я использовал его да. Кроме того, я использовал другую технику с одним шагом, чтобы создать код, который работает в обратном направлении. Вот почему я предлагаю этот метод, где легко подсчитать команды, которые вы выполняете. - person Spyros; 27.12.2010

Один (хотя и медленный) способ — написать собственный отладчик. Затем он сделает точку останова на точке входа вашей программы, и когда она будет достигнута, она установит флаг трассировки на EFlags в контексте, поэтому он также перейдет к отладчику на следующей инструкции. Затем вы можете использовать хэш-таблицу с EIP для подсчета количества попаданий. Единственная проблема заключается в том, что накладные расходы будут экстремальными, и приложение будет работать очень медленно.

person jakobbotsch    schedule 25.12.2010