MWE
#include <iostream>
struct Foo {
Foo() {
std::cout << "Constructing Foo " << this << std::endl;
}
~Foo() {
std::cout << "Destructing Foo " << this << std::endl;
}
};
Foo global_foo;
int main () {
std::cout << "Entering and exiting main()" << std::endl;
return 0;
}
Проблема
Скомпилируйте приведенное выше с параметрами -fprofile-arcs -ftest-coverage
, запустите программу, а затем запустите gcov. Вывод программы ясно показывает, что Foo::Foo(), main() и Foo::~Foo() вызываются именно в таком порядке. Вывод gcov показывает, что вызываются Foo::Foo() и main(), но не Foo::~Foo().
Основная причина
Глобальные объекты уничтожаются внутренним обработчиком выхода GNU (функция, зарегистрированная с помощью at_exit()). Окончательная статистика gcov создается другим обработчиком выхода. Обработчик выхода gcov, очевидно, вызывается перед обработчиком выхода глобального уничтожения, поэтому gcov не видит вызываемые деструкторы.
Статус ошибки
Это старая, старая ошибка в gcov. Вот ссылка на Bugzilla: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7970. а>. Ошибка все еще существует девять лет спустя, по крайней мере, в i686-apple-darwin10-g++-4.2.1.
Вопрос
Является ли это неразрешимой ошибкой в gcov, с которой мне приходится жить, или это просто что-то, что случайно ускользнуло из трещин (девять лет и совершенно забыто)? Если второе, то как исправить?