3) Callgrind работает как динамический переводчик, который обрабатывает оригинальный код счетным кодом. Инструментирование выполняется для каждой инструкции доступа к памяти в коде (для моделирования кэша) и (я предлагаю) для каждой jmp-подобной инструкции для отслеживания exec. отсчет каждого базового блока.
У меня есть небольшой профилировщик выборки, который действует как отладчик; Он вводит счетчик профилирования setitimer()
в приложение, а затем перехватывает весь SIGALRM и печатает текущее значение $eip
.
Ранее было несколько профилировщиков выборки с подходом setitimer
, также есть profil()
для чего-то подобного. Это используется glibc/gmon/gmon.c
и gprof -p
(точнее, gcc -pg
). Функция profil()
позволяет профилировать отдельный фрагмент кода с дискретизацией времени виртуального процессора каждые 1 или 10 миллисекунд. Также имеется функция sprofil()
.
Проверьте также LD_PRELOAD = / lib / libpcprofile.so PCPROFILE_OUTPUT = output.file - но я не знаю, работает ли он или как он работает
Для пронумерованных вопросов:
2) «Callgrind - это расширение Cachegrind. Оно предоставляет всю информацию, которую делает Cachegrind, плюс дополнительную информацию о callgraphs». - Таким образом, он может предоставить любой материал, находящийся в cachegrind, но также он позволяет пользователю отключить симуляцию кэша: --simulate-cache=no
(это значение по умолчанию)
Для скорости: согласно http://www.valgrind.org/docs/manual/nl-manual.html - руководству по инструменту Nul valgrind (он же nulgrind), который не требует дополнительных инструментов, замедление составляет 5 раз. Это потому, что программа динамически переводится самим valgrind. Таким образом, не может быть никакого инструмента для valgrind, который может работать быстрее, чем nulgrind.