Ответ 1
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 (aka nulgrind), которое не требует дополнительных инструментов, замедление составляет 5 раз. Это потому, что программа динамически переводится самой valgrind. Таким образом, не может быть никакого инструмента для valgrind, который может работать быстрее, чем nulgrind.