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;
}
问题
用 options 编译上面的-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 中一个无法解决的错误,是我必须忍受的东西,还是只是碰巧从裂缝中溜走的东西(九岁,完全被遗忘了)?如果是后者,如何解决?