Записать динамическую трассировку инструкций или гистограмму в QEMU?

  1. Я написал и скомпилировал приложение RISC-V для Linux.

  2. Я хочу сбросить все инструкции, которые выполняются во время выполнения (чего нельзя достичь с помощью статического анализа).

Можно ли получить динамическую гистограмму выполнения инструкции сборки из QEMU (или других инструментов)?


person noureddine-as    schedule 24.09.2019    source источник
comment
Содержит ли руководство QEMU что-нибудь полезное по этому вопросу?   -  person fuz    schedule 25.09.2019
comment
Итак, вам нужен подсчет по мнемонике (игнорируя операнды), а не обязательно фактическая трассировка каждой инструкции в порядке выполнения? Имея трассировку, вы можете преобразовать ее в гистограмму, если это необходимо. (Я обновил заголовок вашего вопроса, чтобы он был более конкретным.)   -  person Peter Cordes    schedule 25.09.2019
comment
@PeterCordes Да, это то, что я хочу. Но как получить трассировку (выполненных инструкций гостевой сборки) из QEMU?   -  person noureddine-as    schedule 25.09.2019
comment
Я не знаю, поэтому я проголосовал за ваш вопрос. Но это может быть полезным поисковым термином, поскольку это стандартная терминология и то, что другие люди, вероятно, хотели в какой-то момент.   -  person Peter Cordes    schedule 25.09.2019


Ответы (3)


Для отслеживания инструкций я использую -singlestep -d nochain,cpu в сочетании с некоторыми awk. Это может стать мучительно медленным и большим в зависимости от кода, который вы запускаете.

Что касается статистики, которую вы хотите получить, делегируйте ее R/numpy/pandas/чему угодно после извлечения счетчика программ.

презентация или видео пользователя yvr18 по этой теме может охватывать некоторые аспекты трассировки QEMU на разных уровнях (а также как интересная визуализация тепловой карты).

person slv    schedule 27.02.2020

В настоящее время QEMU не поддерживает такую ​​трассировку всех выполненных инструкций.

  1. Самое близкое, что у нас есть сегодня, это то, что есть различные биты журнала отладки с ключом -d, и вы можете комбинировать отслеживание инструкций, переведенных из гостевого в собственный, с блоками выполненного переведенного кода. translation, чтобы выяснить, что было выполнено, но это довольно неудобно.

  2. В качестве альтернативы вы можете попробовать скриптировать интерфейс gdbstub, чтобы сделать что-то вроде инструкции по дизассемблированию на ПК; singlestep, который (медленно!) даст вам все выполненные инструкции.

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

person Peter Maydell    schedule 26.09.2019
comment
Стоит упомянуть, что для некоторых ISA (особенно x86) есть другие инструменты, которые делают это для одного процесса пользовательского пространства. например SDE от Intel может это сделать, даже гистограммируя напрямую, как просил OP, а также или вместо того, чтобы выплевывать большую трассировку. Он работает путем динамической перекомпиляции (из x86 в x86) для эмуляции новых расширений ISA, а также для бинарного инструментирования. IDK, если есть что-то подобное для RISC-V. Кроме, конечно, использования gdb внутри гостя для пошагового выполнения процесса. В основном та же идея, которую вы предложили для gdb-remote QEMU. - person Peter Cordes; 26.09.2019
comment
Я использовал следующую команду для получения трассировки инструкции $QEMU_LINUX_USER -L $BUILDROOT_OUTPUT/images/rootfs -D logfile.log -d in_asm,cpu,fpu my_program .. Но вы сказали, что это неудобно, вы имеете в виду, что то, что напечатано, не отражает реальность? выполнение мешает хосту? или может быть вызовы хост-сервисов? .. Мне нужно только изучить, сколько инструкций, связанных с вычислениями, было выполнено, сколько обращений к памяти ... и т. д. Такие вещи - person noureddine-as; 27.09.2019
comment
Я имею в виду, что трассировка дает вам отдельно (1) какие гостевые инструкции входят в какие блоки трансляции и (2) отслеживание того, какие блоки трансляции выполняются, так что вы должны сами их рекомбинировать, если хотите знать, какие инструкции выполняются. Обработка циклов также неудобна, поскольку QEMU любит оптимизировать цепочку между ТБ, что означает, что повторяющиеся циклы могут не регистрироваться. (Опция 'nochain' для -d отключает эту оптимизацию и делает QEMU медленнее, а журналы более подробными, но менее запутанными.) Чтобы правильно интерпретировать журнал, вам нужно немного знать о внутренних действиях QEMU. - person Peter Maydell; 27.09.2019

Кажется, вы можете сделать что-то подобное с rv8 (https://github.com/rv8-io/rv8), используя команду:

rv-jit -l
person Marco Merlin    schedule 01.06.2020