Как отслеживать вызовы машинного кода бинарной программой - PullRequest
1 голос
/ 08 февраля 2011

Моя цель - записать количество инструкций процессора, выполненных заданной двоичной программой, за время ее выполнения. Хотя фактический машинный код легко получить из исходного кода (через gdb или любой другой дизассемблер), он не учитывает вызовы функций и ветви внутри программы, которые приводят к тому, что инструкции выполняются более одного раза или вообще пропускаются.

Есть ли прямое решение для этого?

Ответы [ 3 ]

1 голос
/ 09 февраля 2011

Это очень специфично для аппаратного обеспечения, но большинство процессоров предлагают средство, которое подсчитывает точное количество машинных инструкций (и других событий), которые прошли через них.Вот как работают профилировщики, чтобы фиксировать такие вещи, как промахи кэша: путем запроса этих внутренних регистров.

Библиотека PAPI предоставляет вызовы для запроса этих данных на различных основных процессорах.Если вы работаете в Linux + x86, PerfSuite предоставляет вам несколько высокоуровневых инструментов, с которыми проще начать.

У Intel есть приложение для мониторинга , которое можно использовать для наблюдения за внутренними счетчиками чипа в реальном времени, а в Руководстве по анализу производительности описаны различные блоки мониторинга производительности на чипе икак их читать.

1 голос
/ 08 февраля 2011

Если вы работаете в Linux, вы можете запустить вашу программу через cachegrind , чтобы получить количество команд.

Также возможно использовать функцию Run Trace ollydbg для получения количества команд, но это может быть ограничено памятью.

Кроме того, можно написать небольшой отладчик, который просто запускает программу за один шаг.

0 голосов
/ 08 февраля 2011

Необработанные инструменты для отслеживания системных вызовов зависят от платформы.

  • Solaris: truss или dtrace
  • MacOS X: dtrace
  • Linux: strace
  • HP-UX: tusc
  • AIX: truss
  • Windows: ...

Например (Solaris):

truss -o ls.truss ls $HOME

Это будет захватывать все системные вызовы, сделанные ls, поскольку он перечисляет ваш домашний каталог.

OTOH, это может быть не то, что вы ищете ... в этом случае это имеет ограниченную ценность.

...