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中一个古老的、非常老的bug。以下是Bugzilla链接:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7970。该错误至少在i686-apple-darwin10-g++-4.2.1中仍然存在九年之后。
问题
这是gcov中一个无法解决的bug,我必须接受它,还是只是一个被忽略了的问题(九年之久,完全被遗忘)?如果是后者,如何解决?