Как получить .gcda файлы, когда процесс убит? - PullRequest
4 голосов
/ 08 декабря 2010

У меня есть двоичная сборка с -fprofile-arcs и -ftest-coverage. Двоичный файл запускается монитором процесса, который порождает процесс как дочерний процесс. Затем, когда я хочу завершить процесс, я должен пройти через монитор процесса. Он отправляет SIGKILL процессу. Я обнаружил, что .gcda файлы не генерируются в этом случае. Что я могу сделать?

РЕДАКТИРОВАТЬ: На самом деле монитор процесса сначала пытается завершить процесс. Однако библиотека ProcessMonitor (используемая в каждом процессе) вызывает _exit вместо exit, когда пользователь вводит команду для остановки процесса. Это причина всех неприятностей.

Ответы [ 3 ]

4 голосов
/ 08 декабря 2010

Это может сработать: http://nixcraft.com/coding-general/12544-gcov-g.html

В итоге: вызовите __gcov_flush () в программе, возможно, в обработчике сигналов или периодически во время выполнения.

Если код C ++ не забывает сделатьextern "C" объявление функции.

Также не забудьте использовать какой-то препроцессор ifdef, чтобы программа не вызывала его, если он не собран с профилированием.

3 голосов
/ 08 декабря 2010

SIGKILL - это «жесткий» сигнал уничтожения, который не может быть перехвачен приложением.Поэтому приложение не имеет возможности записать файл .gcda.

Я вижу два варианта:

  1. Поймать сигналы, отличные от SIGKILL: любой разумный монитор процесса должен отправлятьSIGTERM первый.init и менеджеры пакетов, с которыми я сталкивался, делают это.SIGKILL является последним средством, поэтому его следует отправлять только после SIGTERM с последующим льготным периодом.
  2. Обходной путь: запустите программу через промежуточную программу, которая получает SIGKILL;периодически проверяйте программу (или в отдельном потоке), если родительский объект все еще жив, и если нет, то завершайте ее корректно.
0 голосов
/ 08 декабря 2010

Afaik-компиляторы (тоже IntelC) хранят статистику профилирования только в обработчике выхода. Так как насчет того, чтобы как-то сказать процессу выйти, а не убивать его? Как, например, добавление обработчика SIGKILL, с выходом () в нем?

...