1. 程式人生 > >gcc覆蓋測試用於嵌入式裝置-gcov lcov genhtml

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後

沒有變動過。不然會提示找不到原始碼。