gcov是什么?Gcov is GCC Coverage颤枪,是一個測試代碼覆蓋率的工具,是一個命令行方式的控制臺程序淑际,伴隨GCC發(fā)布畏纲,配合GCC共同實現(xiàn)對C/C++文件的語句覆蓋和分支覆蓋測試;
與程序概要分析工具(profiling tool春缕,例如gprof)一起工作盗胀,可以估計程序中哪一段代碼最耗時;
注:程序概要分析工具是分析代碼性能的工具锄贼。
gcov能做什么票灰?gcov可以統(tǒng)計每一行代碼的執(zhí)行頻率,實際上哪些代碼確實被執(zhí)行了咱娶,每一段代碼(section code)的耗時(執(zhí)行時間)米间,因此,gcov可以幫你優(yōu)化代碼膘侮,當(dāng)然這個優(yōu)化動作還是應(yīng)該有開發(fā)者完成屈糊。
gcov的使用比較麻煩,首先需要修改編譯選項琼了,加入-fprofile-arcs -ftest-coverage逻锐,或者簡單點直接用--coverage,等同于前者雕薪。另外編譯過程中的鏈接庫需要加上-lgcov昧诱。
在編譯之后,除了生成可執(zhí)行文件外所袁,還會生成gcov需要的額外信息盏档,文件后綴為.gcno。
如果程序是cli命令行燥爷,執(zhí)行一次得出結(jié)果立馬退出結(jié)束了蜈亩,那么會直接生成后綴為.gcda的gcov data文件懦窘。
如果程序是守護(hù)進(jìn)程,需要常駐后臺不能退出稚配,則需要通過信號處理機(jī)制來dump出gcov需要的data文件畅涂,因此在處理信號的代碼中加入如下幾行:
[c++]
extern "C" void __gcov_flush();
switch (signo) {
...
case SIGINT:
// flush out gcov stats data
__gcov_flush();
這樣就會dump出data文件了。
之后對每個.gcno文件生成.gcov文件道川,比如gcno文件名是recserver-main.gcno午衰,那么執(zhí)行g(shù)cov recserver-main,就會生成一堆.gcov文件冒萄,打開每個gcov文件臊岸,第一列,每個數(shù)字尊流,就是所在行的執(zhí)行次數(shù)扇单。
為了方便閱讀,我們還有工具把這些文件轉(zhuǎn)換成可讀性更強的web奠旺,這個工具叫做lcov,下載lcov安裝完成后運行:
lcov -b ./ -d ./ --gcov-tool /usr/bin/gcov -c -o output.info
這樣就會生成一個output.info文件施流。
lcov參數(shù)的含義大家自己去查就好了响疚。
然后我們用genhtml命令就可以生成可以閱讀的web頁面了:
genhtml -o gcovdir/ output.info
-o選項把生成的web頁面指定到gcovdir目錄
生成的web頁面如圖:
左邊每個鏈接都可以點進(jìn)去:
會看到代碼和旁邊的運行次數(shù)。