2013-10-25 38 views
6

考慮以下命令:GCC的代碼覆蓋選項如何工作?

gcc -fprofile-arcs -ftest-coverage main.c 

它生成文件,main.gcda,這是通過對gcov使用,以產生覆蓋分析。 那麼main.gcda是如何生成的呢?儀器如何完成?我可以看到儀表代碼嗎?

回答

12

.gcda;它是由您的程序在執行時生成的。

.gcno是在編譯時生成的文件,它是'備註文件'。 gcc爲每個CU(編譯器單元)生成一個基本的塊圖註釋文件(.gcno)。

那麼main.gcda是如何生成的呢?

在運行時統計數據被收集並存儲在內存中。某些退出回調已註冊,並在程序終止時被調用以將數據寫入.gcda文件。這意味着如果您在程序中調用abort()而不是exit(),則不會生成.gcda文件。

儀器是如何完成的?我可以看到儀表代碼嗎?

你需要檢查gcc的實現來獲取細節,但基本上這個工具是通過向程序插入指令來計算每條指令的執行次數來完成的。但它並不需要爲每條指令保留一個計數器; GCC使用一些算法來生成程序流程圖併爲圖找到一棵生成樹。只有一些特殊的弧線需要檢測,並從中產生所有代碼分支的覆蓋範圍。 您可以反彙編二進制文件來查看檢測代碼。 這裏是覆蓋一些文件,如果你想看看gcc的源文件:

toplev.c coverage.c profile.c libgcov.c gcov.c 的gcov-10。ç

編輯:一些已知的gcov錯誤FYI:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49484

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28441

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44779

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7970

+0

謝謝!你如何追蹤這些文件的覆蓋範圍? –

+1

我曾經使用gcov,遇到一些問題,所以不得不查看其實施。我添加了一些已知的錯誤fyi,但可能會在最近的gcc中解決它們。 – tristan

+0

錯誤49484顯示爲已修復。 – Technophile

3

Can I see the instrumented code?

你不能看到像gcda文件的儀表數據。

Gcov如何工作?

gcov的工作分爲四個階段:

1. Code instrumentation during compilation

2. Data collection during code execution

3. Data extraction at program exit time

4. Coverage analysis and presentation post-mortem.

更多地瞭解各個步驟U可以通過這個PDF文件。不是由編譯器生成

http://ltp.sourceforge.net/documentation/technical_papers/gcov-ols2003.pdf

0

可以看到哪些代碼相關的gcov在被儀表組合物1時間可執行文件或obj文件,您可以使用以下步驟。

nm executable/objfile 

下面是圖像連接的步驟和輸出: -

gcov instrumented code steps

+1

圖像顯示文字的目的是什麼?確保視障人士無法閱讀? –

+0

是的,你說得對。 –