Библиотека профилирования, эквивалентная gprof/callgrind

Я ищу библиотеку C/C++ с возможностями профилирования, такими как gprof или callgrind.

Точнее, я хочу, чтобы его вывод был эквивалентен тому, что выдал бы callgrind, чтобы передать его сторонним инструментам, таким как KCacheGrind.

Идея состоит в том, чтобы иметь возможность разработать аспект на основе этой библиотеки и подключить его к нескольким приложениям, которые мы разрабатываем в моей команде.


person jopasserat    schedule 18.12.2012    source источник
comment
мы также рассматривали возможность перекомпиляции gprof в качестве разделяемой библиотеки, но не предпринимали никаких других инициатив в этом направлении.   -  person jopasserat    schedule 18.12.2012
comment
Вы знаете, что gprof — это просто инструмент отображения, он не генерирует/собирает данные профилирования, верно?   -  person Mat    schedule 18.12.2012
comment
да я в курсе. на самом деле вывод, который нас интересует, является более или менее графом вызовов, поэтому вывод от callgrind также будет удовлетворительным. Я обновлю свой вопрос соответственно.   -  person jopasserat    schedule 18.12.2012
comment
Мне жаль, что до сих пор не ясно, чего вы пытаетесь достичь. Вы ищете библиотеку, которая будет производить данные, подобные callgrind, из... чего-то?   -  person Mat    schedule 18.12.2012
comment
точно. Я хочу интегрировать эту библиотеку в свои приложения, чтобы при необходимости профилировать их.   -  person jopasserat    schedule 18.12.2012
comment
Поскольку вы ученый-компьютерщик (и вас, вероятно, учили, что gprof — это канонический профилировщик) и обладаете некоторыми базовыми знаниями о вероятности и статистике, я надеюсь, что вы знакомы с эти проблемы и эти.   -  person Mike Dunlavey    schedule 19.12.2012
comment
Я знал о части, но спасибо за эти подробные объяснения!   -  person jopasserat    schedule 25.12.2012


Ответы (1)


профилировщик ЦП из gperftools можно прикрепить к произвольным исполняемым файлам с помощью LD_PRELOAD или обычного динамического связывания. Он может выводить данные в формате, совместимом с callgrind.

Предположим, вы хотите профилировать исполняемый файл a.out. Начните с связывания его с -lprofiler. Затем запустите его с CPUPROFILE env. переменная, указывающая на имя файла, в котором будут храниться данные профилирования. Данные в формате callgrind можно получить с помощью pprof.

CPUPROFILE=a.out.prof ./a.out
pprof --callgrind a.out a.out.prof

Что интересно, так это то, что с CPUPROFILE undefined ваш исполняемый файл ведет себя нормально. В результате этот профилировщик можно легко включить без перекомпиляции или повторной компоновки приложения.

Если по какой-либо причине вы не можете изменить способ связывания исполняемого файла, вы все равно можете профилировать его, определив LD_PRELOAD следующим образом.

LD_PRELOAD=/path/to/libprofiler.so CPUPROFILE=a.out.prof ./a.out
person Jan    schedule 18.12.2012