gcov+lcov C程式碼涵蓋範圍 初識

來源:互聯網
上載者:User

原文:

http://wx782870649.blog.163.com/blog/static/12989164120127224317532/

環境:VM+ubuntu  宿機:win7

下面就個人的一個簡單的bubblesort.c程式來說明過程1 寫好bubblesort.c 我的存放在home/xinawang/Documents/bubblesort下來源程式如下#include <stdio.h>       void bubbleSort( int list[], int size )      {        int i, j, temp, swap = 1;        while (swap) {          swap = 0;           for ( i = (size-1) ; i >= 0 ; i-- ) {           for ( j = 1 ; j <= i ; j++ ) {              if ( list[j-1] > list[j] ) {                 temp = list[j-1];                list[j-1] = list[j];                list[j] = temp;                swap = 1;                }             }          }        }   }      int main()      {        int theList[10]={10, 5, 8, 3, 9, 5, 4, 7, 2, 1};        int i;        /* Invoke the bubble sort algorithm */        bubbleSort( theList, 10 );        /* Print out the final list */       for (i = 0 ; i < 10 ; i++) {            printf("%d\n", theList[i]);        }       }2  gcov介紹

gcov伴隨gcc 發布。gcc編譯加入-fprofile-arcs -ftest-coverage 參數產生二進位程式,執行測試案例產生程式碼涵蓋範圍資訊。
用GCC編譯的時候加上-fprofile-arcs -ftest-coverage選項,連結的時候也加上。
fprofile-arcs參數使gcc建立一個程式的流圖,之後找到適合圖的產生樹。只有不在產生樹中的弧被操縱(instrumented):gcc添加了代碼來清點這些弧執行的次數。當這段弧是一個塊的唯一出口或入口時,操縱工具代碼(instrumentation code)將會添加到塊中,否則建立一個基礎塊來包含操縱工具代碼。gcov主要使用.gcno和.gcda兩個檔案。

.gcno是由-ftest-coverage產生的,它包含了重建基本塊圖和相應的塊的源碼的行號的資訊。
.gcda是由加了-fprofile-arcs編譯參數的編譯後的檔案運行所產生的,它包含了弧跳變的次數和其他的概要資訊。
Gcov執行函數覆蓋、語句覆蓋和分支覆蓋。

 

 

關於編譯的過程可以寫成makefile檔案參見我的另一篇文章http://wx782870649.blog.163.com/blog/static/1298916412012722103739143/

此外,還可以為gcov加上這幾個參數

1 gcov -f bubblesort.c 列印每一個函數和整個檔案的實際執行行數與可執行行數的百分比
2 gcov -c bubblesort.c 資料中說的是列印出分支計數,自己驗證下和不帶 -c參數情況下的列印資訊沒什麼區別
3 gcov -b bubblesort.c 列印出程式中總體的分支的執行頻度和相應摘要,在產生的bubblesort.c.gcov檔案中除了每行的執行次數外還有每個分支的頻度,使用此參數可以觀察程式分支,函數調用的情況,協助分析代碼的邏輯層發現問題。


在產生的bubblesort.c.gcov檔案中可以看出對比數組中兩個數的大小的那行代碼執行了90次,執行交換的代碼的是45次,程式的大部分時間都用於進行兩個元素的交換,這個是由於我的數組初始化為[9,,8,7,6,5,4,3,2,1,0]這樣的測試資料順序導致,修改數組中元素次序後,交換元素的次數減少,可見冒泡排序對資料順序非常敏感。


3 lcov


介紹

  • 是GCOV圖形化的前端工具
  • 是Linux Test Project維護的開放原始碼工具,最初被設計用來支援Linux核心覆蓋率的度量
  • 基於Html輸出,並產生一棵完整的HTML樹
  • 輸出包括概述、覆蓋率百分比、圖表,能快速探索覆蓋率資料
  • 支援大項目,提供三個層級的視圖:目錄檢視、檔案視圖、源碼視圖 

   安裝lcov,make install 就行

   lcov是gcov結果展現的一個前端,可以將覆蓋率資訊轉換成html展現。方便我們更清晰的查看覆蓋率結果

使用lcov --directory . --capture --output-file bubblesort.info 

    genhtml -o results bubblesort.info產生html格式的程式碼涵蓋範圍報告


之後就可以在產生的results檔案裡從各個視角查看對該程式的程式碼涵蓋範圍統計

注意:綠色的名字要一致


下面是整個過程中檔案的產生視圖的情況及說明

 

以下是其中幾個產生的html視圖單個C檔案中各個函數的調用次數 整體下每個C檔案的行、函數、分支的覆蓋率

 單個C檔案原始碼的執行情況

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.