Как заставить 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()
Зарегистрированные функции.