2011-06-16 95 views
9

MWE的gcov和全局析構函數

#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的一個不可避免的缺陷,這是我要住在一起,或只是事情發生貫穿性裂縫(九歲,完全忘了)溜?如果後者,如何解決它?

+0

一些upvotes,一個downvote(沒有評論?),但沒有答案或評論到目前爲止。是否有任何堆棧溢出成員有辦法與gcc開發團隊溝通? – 2011-06-17 00:37:42

回答

2

首先,請注意,該錯誤報告自2005年以來未得到確認;你應該添加一個註釋,說你仍然看到g ++中的不良行爲 - 4.2.1。即使沒有人對你的信息採取行動,將這些信息放在那裏也是有用的。

短期來看,如果你想繼續使用gcov,你必須忍受它。您可以考慮使用lcov,這使您能夠從覆蓋率分析中排除指定的線路。公平的警告:我聽說這很好,但我從來沒有用過它。

中期,將該響應添加到錯誤跟蹤器中!沒有保證,但也許這會產生足夠的興趣,爲某種靈魂寫你一個補丁。

長期來看,如果沒有人願意爲你打補丁,你可以自己打補丁。 gcc不是世界上最友好的代碼庫,接受你的改變可能是一種冒險,但如果你真的需要這個,你可以做到這一點。

祝你好運。

+2

感謝您的回覆。我加入了bugzilla報告。短期回答顯然是「與之共存」。我們的產品是一個C++庫,主要用途是在一個自動編碼的模擬環境中使用。由於這是我們的預期目標,我們的很多測試都是在該環境下完成的。該環境的最新版本創建全局靜態數據。我們還擁有繞過該環境的單元測試功能。所以一個明顯的解決方案是要求開發者開發ctor_dtor單元測試。 (我已經做了,而且我已經聽到了這種抱怨。) – 2011-06-17 17:52:22