When execute command: lcov --capture --directory . --no-external --output-file coverage.info to generate code coverage report, I encountered the following error:
$ lcov --capture --directory . --no-external --output-file coverage.info Capturing coverage data from . Can't locate JSON/PP.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/bin/geninfo line 63. BEGIN failed--compilation aborted at /usr/local/bin/geninfo line 63. sh-4.2$ perl -MCPAN -e 'install JSON' Can't locate CPAN.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .). BEGIN failed--compilation aborted.
Can’t locate CPAN.pm
fixed this problem “Can’t locate CPAN.pm” by running the command yum install perl-CPAN
Then run sudo perl -MCPAN -e 'install JSON' again, it works.
Can’t locate JSON/PP.pm
fixed this problem by copying backportPP.pm to the PP.pm file.
$ cd /usr/local/share/perl5/JSON $ ls backportPP backportPP.pm $ cp backportPP.pm PP.pm
Can’t locate Module/Load.pm
bash-4.2$ geninfo --version Can't locate Module/Load.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/bin/geninfo line 63. BEGIN failed--compilation aborted at /usr/local/bin/geninfo line 63. bash-4.2$
Install perl-Module-Load-Conditional can resolved.
sudo yum install perl-Module-Load-Conditional
Can’t locate Capture/Tiny.pm in @INC
sh-4.2$ lcov --version Can't locate Capture/Tiny.pm in @INC (@INC contains: /usr/local/bin/../lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/bin/../lib/lcovutil.pm line 13. BEGIN failed--compilation aborted at /usr/local/bin/../lib/lcovutil.pm line 13. Compilation failed in require at /usr/local/bin/lcov line 104. BEGIN failed--compilation aborted at /usr/local/bin/lcov line 104.
Fixed with following command
perl -MCPAN -e 'install Capture::Tiny'
Then run lcov --version back to work.
sh-4.2$ lcov --version lcov: LCOV version v1.16-16-g038c2ca
Can’t locate DateTime.pm
$ genhtml --help Can't locate DateTime.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/bin/genhtml line 87. BEGIN failed--compilation aborted at /usr/local/bin/genhtml line 87.
Need to install the perl module DateTime, On Centos7 run
sudo yum install 'perl(DateTime)'
But this still doesn’t work for me.
Run geninfo command failed
Capturing coverage data from . Compress::Raw::Zlib version 2.201 required--this is only version 2.061 at /usr/local/share/perl5/IO/Uncompress/RawInflate.pm line 8. BEGIN failed--compilation aborted at /usr/local/share/perl5/IO/Uncompress/RawInflate.pm line 8. Compilation failed in require at /usr/local/share/perl5/IO/Uncompress/Gunzip.pm line 12. BEGIN failed--compilation aborted at /usr/local/share/perl5/IO/Uncompress/Gunzip.pm line 12. Compilation failed in require at /usr/local/bin/geninfo line 62. BEGIN failed--compilation aborted at /usr/local/bin/geninfo line 62. sh-4.2$
注:主分支 master 下面放的是源码,分支 coverage 下的 out 目录是最终的结果报告。
# 这是我的测试环境上的 GCC 和 lcov 的版本 sh-4.2$ gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39) Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the sourcefor copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
sh-4.2$ lcov -v lcov: LCOV version 1.14
Gcov 是如何工作的
Gcov 工作流程图
主要分三步:
在 GCC 编译的时加入特殊的编译选项,生成可执行文件,和 *.gcno;
运行(测试)生成的可执行文件,生成了 *.gcda 数据文件;
有了 *.gcno 和 *.gcda,通过源码生成 gcov 文件,最后生成代码覆盖率报告。
下面就开始介绍其中每一步具体是怎么做的。
1. 编译
第一步编译,这里已经将编译用到的参数和文件都写在了 makefile 里了,只要执行 make 就可以编译了。
In my opinion, SonarQube is not a very easy setup DevOps tool to compare with Jenkins, Artifactory. You can’t just run some script under the bin folder to let the server boot up.
You must have an installed database, configuration LDAP in the config file, etc.
So I’d like to document some important steps for myself, like setup LDAP or PostgreSQL when I install SonarQube of v9.0.1. It would be better if it can help others.
Prerequisite and Download
Need to be installed JRE/JDK 11 on the running machine.
cd sonarqube/ ls wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.0.1.46107.zip
unzip sonarqube-9.0.1.46107.zip cd sonarqube-9.0.1.46107/bin/linux-x86-64 sh sonar.sh console
Change Java version
I installed SonarQube on CentOS 7 machine, the Java version is OpenJDK 1.8.0_242 by default, but the prerequisite shows at least need JDK 11. There is also JDK 11 available on my machine, so I just need to change the Java version.
I recommend using the alternatives command change Java version,refer as following:
$ java -version openjdk version "1.8.0_242" OpenJDK Runtime Environment (build 1.8.0_242-b08) OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
Enter to keep the current selection[+], or type selection number: 3 $ java -version openjdk version "11.0.12" 2021-07-20 LTS OpenJDK Runtime Environment 18.9 (build 11.0.12+7-LTS) OpenJDK 64-Bit Server VM 18.9 (build 11.0.12+7-LTS, mixed mode, sharing)
Install Database
SonarQube needs you to have installed a database. It supports several database engines, like Microsoft SQL Server, Oracle, and PostgreSQL. Since PostgreSQL is open source, light, and easy to install, so I choose PostgreSQL as its database.
4. How to fix ‘Could not resolve 11 file paths in lcov.info’
I want to display Javascript code coverage result in SonarQube, so I added sonar.javascript.lcov.reportPaths=coverage/lcov.info to the sonar-project.properties
But when I run sonar-scanner.bat in the command line, the code coverage result can not show in sonar. I noticed the following error from the output:
INFO: Analysing [C:\workspace\xvm-ide\client\coverage\lcov.info] WARN: Could not resolve 11 file paths in [C:\workspace\xvm-ide\client\coverage\lcov.info]
I have encountered the following problems many times
undefined reference to `__gcov_init' undefined reference to `__gcov_merge_add'
`hidden symbol `__gcov_init' in /usr/lib/gcc/x86_64-redhat-linux/4.8.5/libgcov.a(_gcov.o) is referenced by DSO`
Each time I can fix it by adding -glcov then recompile. the error has gone after rebuild. (you use the nm command to double-check whether the symbol has been added successfully.)