原文:
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
介紹
- 是Linux Test Project維護的開放原始碼工具,最初被設計用來支援Linux核心覆蓋率的度量
- 輸出包括概述、覆蓋率百分比、圖表,能快速探索覆蓋率資料
- 支援大項目,提供三個層級的視圖:目錄檢視、檔案視圖、源碼視圖
安裝lcov,make install 就行
lcov是gcov結果展現的一個前端,可以將覆蓋率資訊轉換成html展現。方便我們更清晰的查看覆蓋率結果
使用lcov --directory . --capture --output-file bubblesort.info
genhtml -o results bubblesort.info產生html格式的程式碼涵蓋範圍報告
之後就可以在產生的results檔案裡從各個視角查看對該程式的程式碼涵蓋範圍統計
注意:綠色的名字要一致
下面是整個過程中檔案的產生視圖的情況及說明
以下是其中幾個產生的html視圖單個C檔案中各個函數的調用次數 整體下每個C檔案的行、函數、分支的覆蓋率
單個C檔案原始碼的執行情況