Вас может заинтересовать valgrind, и это инструмент callgrind.
valgrind --trace-children=yes --tool=callgrind -v ./program
Он генерирует детализированный callgraph-файл в файл, включая, помимо прочего, количество времени, прошедшего в каждой функции.
Затем вы можете увидеть все это с помощью kcachegrind, который является хорошим интерфейсом для визуализации данных.
kcachegrind
Это позволит вам увидеть все функции, которые вызвали pthread_mutex_lock () (или другие), и среди них самые высокие по проценту времени ...
Наиболее важной частью callgrind является то, что вы легко можете найти узкое место в однопоточной программе, потому что вам просто нужно посмотреть функцию, которая заняла больше всего времени процессора.
В многопоточной программе функция, ожидающая чего-то долгое время (мьютекс), является нормальным условием, поэтому она сложнее.
Вы также можете использовать инструмент Helgrind от valgrind, который поможет найти ошибки при использовании мьютексов (потенциальные тупики или потенциальные скачки данных).
Я полагаю , что он анализирует ваши вызовы функций синхронизации и данные, которые вы читаете / записываете, чтобы обнаружить потенциальную проблему (проблему, которая может возникнуть 1 раз за 1000000), анализируя сериализуемость соответствие вашей синхронизации и доступа к данным. (Повторяю: наверное).
valgrind --tool=helgrind --suppressions=$PWD/supp --gen-suppressions=yes --db-attach=yes --track-lockorders=no ./program
И основная особенность valgrind: проверка утечки памяти:
valgrind --leak-check=yes -v --db-attach=yes ./program