Файлы .gcda не объединяются при нескольких запусках

У меня есть две основные функции, которые используют общий класс С++.

Файл1: main.cpp

   #include <iostream>
   #include "HelloAnother.h"

   int main() {
       HelloAnother::sayHello1();
       return 0;
   }

Файл2: main2.cpp

   #include <iostream>
   #include "HelloAnother.h"

   int main() {
       HelloAnother::sayHello2();
       return 0;
   }

Файл 3: HelloAnother.h

   #pragma once
    class HelloAnother {
        public:
         static void sayHello1();
         static void sayHello2();
    };

Файл4: HelloAnother.cpp

#include <iostream>
#include "HelloAnother.h"
void HelloAnother::sayHello1() {
    std::cout << "Hello 1!!!" << std::endl;
}

void HelloAnother::sayHello2() {
    std::cout << "Hello 2 !!!" << std::endl;
}

Теперь я компилирую два исполняемых файла: clang-3.8 -o main -fprofile-arcs -ftest-coverage --coverage -g -fPIC -lstdc++ main.cpp HelloAnother.cpp

clang-3.8 -o main2 -fprofile-arcs -ftest-coverage --coverage -g -fPIC -lstdc++ main2.cpp HelloAnother.cpp

Теперь я бегу ./main

Привет 1!!!

Когда я перезапускаю ./main

Привет 1!!!

профилирование: /media/sf_ubuntu-shared/test-profiling/main.gcda: невозможно сопоставить: неверный аргумент профилирование: /media/sf_ubuntu-shared/test-profiling/HelloAnother.gcda: невозможно сопоставить: неверный аргумент

Одна секунда запуска, я получаю эту ошибку (выше) при попытке создать/объединить файлы .gcda.

Теперь, если я попытаюсь запустить ./main2

привет 2!!!

профилирование: /media/sf_ubuntu-shared/test-profiling/HelloAnother.gcda: невозможно сопоставить: неверный аргумент

Когда я создаю отчет о покрытии кода, вызов второй функции не отображается, как будто вызов не был сделан.

Может ли кто-нибудь помочь мне отладить эту проблему, пожалуйста? Проблема, по-видимому, связана с объединением файлов .gcda при нескольких запусках, но не знаю, как ее решить.

Я также пробовал clang-3.5, но с теми же результатами.


person Pratik Bansal    schedule 21.07.2016    source источник
comment
Какая у вас ОС и ее версия? Вы устанавливали clang из этой ОС или собирали сами?   -  person osgx    schedule 21.07.2016
comment
$ uname -a : Linux pratik-ubuntu 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux Я установил clang с помощью apt-get install.   -  person Pratik Bansal    schedule 23.07.2016
comment
Кстати, забыл упомянуть, я работаю в Ubuntu, установленной на VirtualBox с хостом Mac OSX.   -  person Pratik Bansal    schedule 23.07.2016
comment
Это Ubuntu 14.04.1, и она должна быть одинаковой на оборудовании или в виртуальном боксе.   -  person osgx    schedule 23.07.2016


Ответы (1)


После долгих поисков и проб/ошибок это то, что работает для меня:

  1. Скомпилируйте первый исполняемый файл, запустите его. Это создает файлы HelloAnother.gcda и main.gcda.
  2. Выполнить lcov --gcov-tool=gcov-4.4 --directory . --capture --output-file coverage.main.info
  3. рм -рф *.gcda; rm -rf *.gcno
  4. Скомпилируйте второй исполняемый файл (main2.cpp), запустите его. При этом создаются еще один файл HelloAnother.gcda и файл main2.gcda.
  5. Выполнить lcov --gcov-tool=gcov-4.4 --directory . --capture --output-file coverage.main2.info
  6. Теперь, чтобы создать красивый HTML-отчет, выполните: genhtml -o coverage coverage.main.info coverage.main2.info
person Pratik Bansal    schedule 21.07.2016
comment
Я думаю, вам не следует компилировать два исполняемых файла из одного и того же исходного каталога. - person osgx; 23.07.2016
comment
Почему это должно быть ограничением @osgx? Наш вариант использования — компилировать несколько модульных тестов в виде исполняемых файлов и запускать их один за другим. - person Pratik Bansal; 25.07.2016