2015-02-16 2 views
0

Я новый пользователь Valgrind, и до сих пор я знаю, что могу анализировать выходной файл, как в приведенном ниже примере: «Для одного вызова функции свопирования требуется 15 инструкций : 3 для пролога, 3 для назначения tmp, 4 для копирования с * b на * a, 3 для назначения из tmp и еще 2 для эпилога ».Печать инструкции Мнемоника на строку кода в выводе Valgrind

. void swap(int *a, int *b) 
    3,000 { 
    3,000  int tmp = *a; 
    4,000  *a = *b; 
    3,000  *b = tmp; 
    2,000 } 

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

. void swap(int *a, int *b) 
    3,000 {     [insta, instb, instc] 
    3,000  int tmp = *a; [insta, instb, instc]     
    4,000  *a = *b;   [instd, instd, insta, instc] 
    3,000  *b = tmp;  [instc, insta, instb] 
    2,000 }     [instc, insta] 

Пример источника (http://web.stanford.edu/class/cs107/guide_callgrind.html)

С наилучшими пожеланиями, Raul.

+0

kcachegrind (qcachegrind) GUI viewer имеет разборный вид для вывода инструментов callgrind и cachegrind valgrind (профилировщики на основе valgrind). Как я знаю, kcachegrind использует внешний вызов для objdump и анализирует его, чтобы получить смешанное представление. Инструмент 'callgrind_annotate' не имеет возможности выбрать листинг сборки. (PS: вы должны помнить, что valgrind является симулятором, и он имитирует разный процессорный конвейер. Intel - это процессор Out-of-order и может выполнять до 4 инструкций за такт, каждая инструкция переводится на половину, одну или несколько микроопераций) – osgx

ответ

0

Kcachegrind (qcachegrind, http://kcachegrind.sourceforge.net/) GUI viewer имеет разборный вид для вывода инструментов callgrind и cachegrind valgrind (профилировщики на основе valgrind).

Как я знаю, kcachegrind использует внешний вызов для objdump и анализирует его вывод, чтобы получить смешанный вид со счетчиками для отдельных инструкций и с разборкой машинного кода.

Инструмент callgrind_annotate (используемый в вашем примере) не имеет возможности выбрать сборку в соответствии с документами http://valgrind.org/docs/manual/cl-manual.html#cl-manual.callgrind_annotate-options (и в исходном коде этого скрипта нет такой поддержки).

PS: Вы должны помнить, что valgrind является симулятором и имитирует другой конвейер процессора. Ваш Intel - это процессор Out-of-order и может выполнять до 4-х инструкций за такт, каждая инструкция переводится на половину, одну или несколько микроопераций. Таким образом, вы можете получить «. Один вызов функции свопинга требует 15 инструкций», но 15 команд означают не 15 тактовых циклов процессора реального CPU.

PPS: Ваша страница http://web.stanford.edu/class/cs107/guide_callgrind.html говорит в Советах

аннотаций за функции часто слишком грубые, чтобы быть полезными, отсчеты линии по линиями являются ключевыми для получения более полезной детали. Вы даже можете опуститься, чтобы наблюдать количество событий на уровне сборки. Создайте код с информацией об отладке на уровне сборки, отредактировав Makefile, чтобы включить флаги компилятора -Wa,--gstabs -save-temps. Затем, при запуске callgrind, используйте опцию --dump-instr=yes, которая запрашивает подсчеты на инструкцию сборки. При аннотации этого вывода callgrind_annotate теперь будет соответствовать событиям для операторов сборки. Круто!

Смежные вопросы