Поиск функций, вызываемых в многопроцессной программе без изменения исходного кода?


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

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

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

2   4   2009-04-28 07:15:01

2 ответа:

Взгляните на GCov: http://gcc.gnu.org/onlinedocs/gcc/Gcov.html

Здесь они предлагают использовать 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 от дочернего и родительского элементов может быть перепутан, что обычно делает его бесполезным.