В последнее время я пытался использовать gcc/gcov для тестирования покрытия кода для проекта C++. Проект состоит из своего основного модуля и нескольких библиотек .so, которые все должны быть приняты в расчет.
Я скомпилировал все модули с параметром --coverage, каждый с помощью gcc, и сохранил их там, где они были сгенерированы, вместе с соответствующими файлами тегов .gcno. После нормального выполнения и корректного выхода файлы .gcda могли быть правильно сгенерированы. Проблема в том, что программа должна быть службой без прерывания или завершения, и ей не разрешается вставлять какой-либо индивидуальный код (например, обработчик сигналов) в основной модуль. Как предлагают решения из Интернета, я написал функцию обработчика сигналов в автономной библиотеке .so, которая вызывает __gcov_flush при получении сигнала SIGUSR1 для сброса счетчиков покрытия во время выполнения в файлы. .
Однако было замечено, что хотя функция __gcov_flush гарантированно вызывается должным образом, во время выполнения создается только файл .gcda библиотеки .so. Мне кажется, что __gcov_flush отвечает за сброс данных модуля-оболочки, но не других. Интересно, так ли это должно работать, или есть какие-то хитрости, о которых мне нужно позаботиться, чтобы получить полные результаты?