Нахождение каких функций вызывается в многопроцессорной программе без изменения источника? - PullRequest
4 голосов
/ 28 апреля 2009

Я работаю над проектом, в котором мне нужно найти, какие функции вызываются в различных программах Linux (написанных на C) с учетом конкретных входных данных. Мой текущий подход состоял в том, чтобы скомпилировать программу с параметром -pg (опция профилирования), запустить ее и найти, какие функции вызывают при обработке вывода gprof. В выходном файле отображаются только те функции, которые были вызваны хотя бы один раз.

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

Есть ли способ заставить gprof создавать выходной файл для каждого процесса (возможно, помеченный pid)? В руководстве предлагается изменить каждый процесс в отдельную директорию, но я не хочу изменять исходный код для этого. Есть ли другой инструмент для Linux, который может помочь?

Ответы [ 2 ]

3 голосов
/ 28 апреля 2009

Здесь они предлагают использовать tprof :

Вы пробовали Вальгринд?

http://www.network -theory.co.uk / Docs / Valgrind / valgrind_17.html

--child-silent-after-fork=<yes|no> [default: no] 

Если этот параметр включен, Valgrind не будет отображать никаких результатов отладки или записи в журнал для дочернего процесса, возникающего в результате вызова fork. Это может сделать вывод менее запутанным (хотя и более вводящим в заблуждение) при работе с процессами, которые создают дочерние элементы. Это особенно полезно в сочетании с --trace-children =. Также рекомендуется использовать этот флаг, если вы запрашиваете вывод XML (--xml = yes), так как в противном случае XML от дочернего и родительского элементов может смешаться, что обычно делает его бесполезным.

2 голосов
/ 28 апреля 2009

Посмотрите на GCov: http://gcc.gnu.org/onlinedocs/gcc/Gcov.html

...