Как заставить gcov извлекать данные, даже если программа прервана

Я использую инструмент генерации тестов под названием KLEE, который создает множество тестов для моего кода C99. После этого я запускаю тесты и проверяю покрытие линии с помощью gcov. Похоже, что Gcov обновляет данные покрытия в конце прогона после успешного завершения.

Однако некоторые тесты не выполняются (утверждают, что операторы неверны), что приводит к прерыванию программы и gcov не учитывает строки, описанные в этом прогоне.

Есть ли способ, которым gcov сбрасывает информацию на любом выходе (не только на успешном)?

1 ответ

Решение

Вызов void __gcov_flush(void) (из libgcov.a, который связан с -fprofile-arcs опция компилятора) в вашем коде assert, непосредственно перед убийством и применением (например, изменение abort(); в __gcov_flush();abort();). Эта функция вызовет функцию gcov_exit (она статически определена в libgcov). gcov_exit - это основные функции для сохранения собранного покрытия в файл. Зарегистрировано __gcov_init с atfork(); а ваш assert игнорирует atfork, когда убивает приложение.

Еще один способ решить эту проблему - выяснить, почему ваше утверждение игнорирует atfork()Зарегистрированные функции.

Другие вопросы по тегам