gcc覆蓋測試用於嵌入式裝置-gcov lcov genhtml
轉載:https://www.cnblogs.com/StitchSun/p/4480229.html
交叉編譯鏈為:/opt/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcov"
環境要求:
1、有被測的原始碼
2、對應平臺的交叉編譯器必須包含gcov功能
3、安裝好lcov工具
4、相應的嵌入式裝置
使用gcov/lcov測試程式碼覆蓋率,總共分為三步:
1、在原始碼編譯中新增gcov編譯引數,然後編譯debug版本,同時生成gcno檔案
2、執行生成的程式,生成程式碼覆蓋檔案gcda
3、使用lcov工具解析gcno和gcda檔案,生成html報表檔案
下面詳細說明三個步驟如何操作:
1、在原始碼編譯中新增編譯引數
需要新增的編譯引數為:-fprofile-arcs -ftest-coverage;同時新增引數對應的庫-lgcov
新增完成後,進行編譯。然後查詢,找到生成的字尾名為gcno檔案的話,則說明成功。
重要:gcno檔案生成的路徑,這個一般是根據Makefile指令碼指定的不同路徑來確定的,有的時候與原始碼在一起,有的時候與中間檔案在一起。
但是不管gcno的路徑在哪裡,要記住這個路徑。後續有用的。
2、執行測試程式
把編譯好的測試程式在對應的裝置上執行測試,執行沒有錯誤後,然後檢視嵌入式裝置的目錄,到與生成gcno路徑一致的目錄下,查詢gcda檔案
gcda檔案生成路徑為編譯時生成gcno的路徑,不過gcno是在編譯伺服器上,gcda是在程式執行的嵌入式裝置上。
3、使用lcov解析gcda和gcno檔案
把裝置的gcda檔案下載到編譯伺服器,同時把編譯時生成的gcno檔案也複製到同一個目錄。
對於前面名稱相同的檔案,gcda和gcno檔案必須在同一目錄下。
但是這個工具無法直接解析嵌入式平臺產生的gcno和gcda格式的檔案,需要修改一個地方。
即這個工具預設的是使用linux系統自帶的gcov,需要修改為使用交叉編譯器的gcov工具。
修改的檔案為:bin/geninfo 的,把原來的gcov修改為交叉編譯的gcov。
修改完成,儲存退出。
以使用的arm-linux-gcc 4.5.1 交叉編譯器為例,執行下面的命令:
a /usr/local/bin/lcov -d . -c -o test.info
b /usr/local/bin/genhtml -o result test.info
看到上面的提示,說明執行成功了。把result資料夾下載到windows上,開啟裡面的index,就可以看到結果了。
常見問題:
1、geninfo: ERROR: …: reached unexpected end of file
注意,lcov 最好使用 1.9 及以上版本,否則可能遇到如下錯誤:
geninfo: ERROR: …: reached unexpected end of file
2、 gcov解決stamp mismatch with graph file
使用 hexdump -e '"%x\n"' -s8 -n4 命令分別解析 XXX.gcno和XXX.gcda檔案
如果生成的碼不一致,則說明gcno和gcda不是一次編譯生成的,需要重新編譯。
命令使用如下:
hexdump -e '"%x\n"' -s8 -n4 dns_shell.gcno
3、找不到原始碼
在解析gcno和gcda時,要和原始碼在一個伺服器上,並且原始碼的路徑在生成gcno和gcda後
沒有變動過。不然會提示找不到原始碼。