1. 程式人生 > >Linux下程式碼覆蓋率工具:gcov

Linux下程式碼覆蓋率工具:gcov



Linux下程式碼覆蓋率工具:gcov

對於C/C++軟體開發,常常需要通過程式碼覆蓋率報告來了解測試用例的場景覆蓋情況,對於測試用例未覆蓋的程式碼分支流程,需要補充用例,以保證測試用例的全面性與完整性,不漏測任何一個分支BUGLinux下可用gcov工具生成覆蓋率統計資訊,然後藉助gcov的圖形化工具lcov,可生成html格式的程式碼覆蓋率報告,進一步提高覆蓋率測試結果的可讀性。

1Gcov實現原理

Gcc中新增-ftest-coverage編譯選項後,則:

1)輸出目標檔案中留出一段儲存區用於儲存統計資料;

2)原始碼中每一行可執行語句生成的程式碼之後注入一段更新覆蓋率統計結果的程式碼;

3)在可執行程序檔案中,進入main函式之前呼叫 gcov_init初始化統計資料區,並將gcov_exit註冊為 exit handlers

4)使用者側程式碼呼叫exit 時,將呼叫gcov_exit,其繼續呼叫__gcov_flush函式輸出統計資料到*.gcda檔案中。

gcov實現原理可知,若使用者程序並未呼叫 exit退出,就得不到覆蓋率統計資料,也就無從生成報告了。而後臺服務程式一旦啟動很少主動退出。為了解決這個問題,我們可以給待測程式註冊一個訊號處理函式(signal handler),處理SIGINTSIGQUITSIGTERM等常見強制退出訊號,並在訊號處理函式中主動呼叫

exit __gcov_flush函式,以便輸出統計結果。

上述方案需要修改待測程式程式碼,可以借用動態庫預載入技術和gcc擴充套件的constructor屬性,將signal handler和註冊過程都封裝到一個獨立的動態庫中,並在預載入動態庫時實現訊號攔截註冊。這樣,就可以通過如下命令列來實現異常退出時的統計結果輸出:

LD_PRELOAD=./gcov_preload.so./test

測試完成後,直接killtest程序,即可獲得正常的統計結果檔案*.gcda。其中,gcov_preload.so是你自己寫的一個程式,接受SIG,然後exit,以觸發gcov進行輸出。

接下來,我們詳細說明

gcov的使用步驟。

Gcov屬於gcc工具集之一,是隨gcc一起釋出的,並不需要獨立安裝。lcov需要自己下載開源軟體安裝。Lcov開源軟體的下載地址:

https://sourceforge.net/projects/ltp/files/Coverage%20Analysis/

lcov-1.13.tar.gz為例,安裝步驟比較簡單:

tar –zxvf lcov-1.13.tar.gz

cd lcov-1.13/

make install

lcov可執行二進位制預設安裝在/usr/local/bin目錄下,若該路徑不在環境變數$PATH中,可先用export PATH=$PATH: /usr/local/bin新增進來,以便後續使用。

2、編譯連結

為了生成生成覆蓋率統計資訊,需要在編譯時新增編譯選項:

編譯選項CFLAGS += -fprofile-arcs -ftest-coverage,或CFLAGS += --coverage,其中-fprofile-arcs用於生成.gcno檔案,-ftest-coverage用於生成.gcda檔案。

連結選項LDFLAGS += -lgcov,注:此選項僅在使用ld連結時需要,使用gcc時不需要。

舉例說明,編輯一個test.c檔案,內容如下:

#include <stdio.h>

#include <stdlib.h>

int func_1(char *ptr)

{

if (NULL == ptr)

{

printf("func_1:ptr==NULL!\n");

return 1;

}

printf("func_1: ptr: %p\n", ptr);

return 0;

}

void func_2(char *ptr)

{

printf("func_2: ptr: %p\n", ptr);

}

void func_3(void)

{

printf("func_3...\n");

}

void main(int argc, char *argv[])

{

char *ptr = NULL;

func_1(ptr);

ptr = (char *)malloc(8);

func_2(ptr);

free(ptr);

return;

}

執行gcc編譯命令:

[[email protected] gcov]# gcc -fprofile-arcs -ftest-coverage test.c -o test

[[email protected] gcov]# ls

lcov-1.13testtest.ctest.gcno

編譯生成test可執行程式的同時,也生成了同名的.gcno檔案。

3、執行

執行test程式,生成同名的.gcda檔案:

[[email protected] gcov]# ./test

func_1:ptr==NULL!

func_2:ptr: 0x99b5008

[[email protected] gcov]# ls

lcov-1.13testtest.ctest.gcdatest.gcno

執行gcov命令,生成覆蓋率資訊檔案,即.gcov檔案:

[[email protected] gcov]#gcov test.c

File'test.c'

Linesexecuted:73.68% of 19

test.c:creating'test.c.gcov'

[[email protected] gcov]# ls

lcov-1.13testtest.ctest.c.gcovtest.gcdatest.gcno

test.c.gcov就是程式碼覆蓋資訊檔案,但看起來並不直觀,下面我們進一步分析。

4、覆蓋率分析

覆蓋率分析過程分兩步。

首先,藉助lcov對覆蓋率檔案test.c.gcov進行改造,生成了test.info檔案:

[[email protected] gcov]#lcov -c -d . -o 'test.info' -b .

Capturing coverage data from .

Found gcov version: 4.4.7

Scanning. for .gcda files ...

Found 1 data files in .

Processing test.gcda

Finished .info-file creation

[[email protected] gcov]# ls

lcov-1.13testtest.ctest.gcdatest.gcnotest.info

其次,通過genhtml工具(lcov工具集中帶有)生成result資料夾,其中就包含index.html,可以直接雙擊開啟檢視:

[[email protected] gcov]# genhtml -o result test.info

Reading data file test.info

Found 1 entries.

Found common filename prefix "/home/hanlzh/test"

Writing .css and .png files.

Generating output.

Processing file gcov/test.c

Writing directory view page.

Overall coverage rate:

lines......: 73.7% (14 of 19 lines)

functions..: 75.0% (3 of 4 functions)

[[email protected] gcov]# ls

lcov-1.13resulttesttest.ctest.gcdatest.gcnotest.info

[[email protected] gcov]# ls result/

amber.pngemerald.pnggcovgcov.cssglass.pngindex.htmlindex-sort-f.htmlindex-sort-l.htmlruby.pngsnow.pngupdown.png

最後,檢視結果:

1)在windows介面下,雙擊index.html,顯示目錄級別下的覆蓋率統計資訊;

2)進一步點選目錄gcov,顯示檔案級別的覆蓋率統計資訊;

3)進一步點選檔案test.c,顯示檔案內分支語句的覆蓋率詳細資訊;

顯然地,標紅行是執行./test時沒有執行到的語句,可以為我們進一步優化程式碼或補充測試用例提供了參考。

5、總結

Lcovgenhtml的功能比較豐富,選項引數比較多,感興趣的讀者可以通過man lcovman genhtml查閱。

相關推薦

Linux程式碼覆蓋率工具gcov

 Linux下程式碼覆蓋率工具:gcov 對於C/C++軟體開發,常常需要通過程式碼覆蓋率報告來了解測試用例的場景覆蓋情況,對於測試用例未覆蓋的程式碼分支流程,需要補充用例,以保證測試用例的全

Linux的開發工具vim,gcc,gdb,makefile以及yum語句安裝軟體

Linux下的開發工具:vim,gcc,gdb,makefile以及yum語句安裝軟體 1. vi/vim  vi/vim都是多模式編譯器,vim是vi的升級版本。vim有12個模式,在這我們先說3種模式,命令模式,插入模式,底行模式。 2. vim基本操作: $vim t

linux程式碼對比工具 diffuse 和 meld

meld的目錄對比可以對比兩個工程有多少檔案不同,每個檔案做過哪幾行修改,非常直觀。好東西~ 在此之前還用過diffuse,可以做檔案對比。 diffuse -m 似乎還可做目錄對比,但感覺不如meld直觀。

Linux記憶體檢測工具asan

 Linux下記憶體檢測工具:asan ASAN(Address-Sanitizier)早先是LLVM中的特性,後被加入GCC 4.8,在GCC 4.9後加入對ARM平臺的支援。因此GCC

LINUXIDEA等工具調試項目時提示Unable to open debugger port

over sed ubuntu cep 去掉 exc clas dig window 在Ubuntu下調試項目時使用TOMCAT容器,在設置好相應的TOMCAT LOCAL 路徑及相關信息後,點擊調試項目出現: Unable to open debugger port :

linux啟動mysql提示Timeout error occurred trying to start MySQL Daemon

任務 自帶 lean linu 使用 custom 方式 files 一個 啟動 mysqld 時經過很長時間顯示 Timeout error occurred trying to start MySQL Daemon. 終端進入 mysql 時顯示 ERROR 2002

Linux性能監控工具Glances部署實錄

linux python glances [root@king01 ~]# yum install -y zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel readline readline-devel openssl openssl-

Linux安裝yum工具

Linux安裝yum工具[root@localhost ~]# yum -y install fonts-chinese Loading "rhnplugin" plugin Loading "security" plugin This system is not

linux的壓縮工具

使用 line OS unicode 類型 .gz IT 能夠 GZip壓縮 壓縮工具的介紹 壓縮服務器的經常訪問的文件,如web網頁,壓縮後可節省帶寬資源linux下的打包工具,後綴名在linux中不代表實際意義,但是為了方便區分文件類型,後綴名會以一個規範來命名.zip

Linux批量管理工具pssh使用記錄

time etc hosts ptime 同時 參數 -i ble test pssh是一款開源的軟件,使用python實現,用於批量ssh操作大批量機器;pssh是一個可以在多臺服務器上執行命令的工具,同時支持拷貝文件,是同類工具中很出色的;比起for循環的做法,我更推薦

Linux使用ASF工具Steam掛卡的配置使用

enable hist .com repos 不錯 rpm ech ssi farm Linux下使用ASF工具 Steam 掛卡的配置使用 簡介 既然你都費錢買了遊玩,為甚麽還要花時間玩呢?這款工具便可以不用下載遊玩,主動掛卡,是Steam回血渠道之一。(慈悲包)

Linux各壓縮工具的使用方法

壓縮工具 compress compress +檔案【多個檔案時壓縮每個檔案為單獨的壓縮檔案】 壓縮該檔案,壓縮後該檔案消失,生成一個.z的壓縮檔案 compress -c +檔案 > 檔案.gz壓縮檔案並顯示過程 不會丟失原始檔,利用重定向保留原檔案 uncomp

linux檔案比較工具diff|cmp使用小結

轉自:http://blog.csdn.net/wangjianno2/article/details/50451737,記錄下便於忘記時查詢。 1.diff diff是Unix系統的一個很重要的工具程式。它用來比較兩個文字檔案的差異,是程式碼版本管理的基石之一。 2.diff使用

Facebook開源Linux核心元件和工具BPF、Btrfs、Netconsd、Cgroup2、PSI、Oomd

內容摘要: 作者:Tejun Heo(Facebook的軟體工程師)和Thomas Connally。 Facebook工程文化的一個組成部分始終是我們的開發團隊致力於開發開源解決方案,以解決實際的生產問題,並應對現代大規模雲端計算的重大挑戰。今天,我們宣佈了一套解決重要

JaCoCo 程式碼覆蓋率工具(基於Maven+TestNG)

JaCoco是一個程式碼覆蓋率庫。 安裝:  以 Maven(http://www.testclass.net/maven/) 安裝為例: <dependencies> <dependency> <gro

手寫一個Linux的debug工具(一)

寫在前面 學習過Linux程式設計的同學都或多或少用過gdb來除錯自己的程式,但是並沒有很多的資源讓我們學習有關偵錯程式的東西。希望通過這篇文章,你可以瞭解基本的除錯原理,更重要的是可以寫出一個自己的簡易除錯工具。更有趣的是,你可以瞭解如何修改記憶體,來“愚弄

linuxMongodb叢集搭建分片+副本集

三臺伺服器 192.168.1.40/41/42 安裝包 mongodb-linux-x86_64-amazon2-4.0.1.tgz 服務規劃  伺服器40  伺服器41  伺服器42  mongos  mongos  mongos  config server  config server  

linux使用ab工具對伺服器進行壓力測試

ab 安裝 yum -y install httpd-tools (centos) 安裝完成後使用ab -v 檢視ab版本確認是否安裝成功 選項 選項 含義 -A auth-username:password 對伺服器提供BASIC認證信任。 使

cs231n-pytorch安裝+linux截圖工具安利

一、pytorch安裝(linux) linux下,很簡單.. 點選,根據自己的情況點點點,點選項就OK。這是我的情況,顯示卡趕緊買買買,加速duangduangduang 底下很貼心的出來命令,跑就是了。 然後驗證安裝 沒出錯就OK啦,我是直接裝好的,

測試覆蓋率工具EclEmma TestNG 入門教程

目錄 1 測試覆蓋率實現技術2 EclEmma介紹3 EclEmma測試覆蓋率指標4 EclEmma安裝5 示例專案介紹  5.1 建立專案  5.2 用Coverage as TestNG Suite跑用例