C++ 使用 gcov 和 lcov 的问题?

Posted

技术标签:

【中文标题】C++ 使用 gcov 和 lcov 的问题?【英文标题】:C++ Using gcov and lcov problem? 【发布时间】:2011-06-18 04:02:47 【问题描述】:

我使用的是 ubuntu 10.1,g++ 编译器。

我尝试在我的 C++ 项目中使用 gcov 和 lcov。我设法编译了 gcov:

g++ -fprofile-arcs -ftest-coverage main.cpp user.cpp game.cpp

没有错误或警告消息。接下来我尝试运行 gcov:

gcov main.cpp user.cpp game.cpp

也不错。我也尝试运行我的程序:

./a.out

再次运行 gcov,我的 main、user 和 game.cpp 现在显示了一些百分比。我想捕获数据,我在终端中输入:

lcov --directory /home/projects/Game1/ -c -o application.info

但它给了我这个:

Capturing coverage data from /home/projects/Game1/
geninfo: ERROR: cannot read /home/projects/Game1/!

我在网上搜索,阅读 lcov 文档,但找不到答案。谁能帮帮我?

另外,我也打不开main.gcda文件。(我尝试使用文本编辑器打开,它说一些字符编码问题,相当多:UTF-8,Western(ISO-8859-1),Western( ISO-8859-11) 等,但仍然无法打开和读取文件。

请帮帮我..有人吗?

编辑:

我承认,这是我的错误(非常抱歉,“home/Projects/Game1”大写“P”。) 验证路径后,我得到了这个新错误:

geninfo: ERROR: /home/Projects/Game1/main.gcno: reached unexpected end of file

【问题讨论】:

保证目录名称拼写正确并包含您的代码和对象?您是否尝试在该目录中以lcov --directory . 运行它? 我编辑了我的问题,你是对的:我愚蠢的“粗心”。但是,新的错误信息也打败了我:geninfo: ERROR: /home/Projects/Game1/main.gcno:达到了文件的意外结尾 我也出现同样的错误,请问你最后运气好吗? 你只安装了一个 gcc 版本吗?我在将 g++4.7 安装到 Ubuntu 12.04 并默认安装时遇到了同样的问题,但是当我检查 gcov 版本时,它是 4.6。真正的 /usr/bin/gcov 只是 gcov-4.6 的符号链接,所以我尝试将其修复为 gcov-4.7,之后我从 bash 获得了正确的工作 gcov,但 lcov 的错误相同。我的解决方案是使用 g++4.6 而不是 g++(到 g++4.7 的符号链接) 【参考方案1】:

使用以下代码编译代码:

lcov --directory . --output-file app.info

然后使用以下内容制作html页面。

genhtml app.info

【讨论】:

-1 lcov 不会编译代码,genhmtml 应该是 genhtml【参考方案2】:

我遇到了完全相同的问题。事实证明,如果库代码在您已经运行覆盖测试时发生更改,有时它会感到困惑。摆脱它的唯一方法是删除导致错误的文件并重新编译。

【讨论】:

这也解决了我的问题。谢谢。【参考方案3】:

确保包含 -g 标志(调试信息):-g -fprofile-arcs -ftest-coverage

在使用 lcov 时,我发现最好使用绝对路径而不是相对路径。您可以尝试使用 lcov 通过 -i, --initial 开关捕获初始零覆盖日期。

这是我实现零计数器的一个示例

$ lcov --zerocounters --directory myFullPath
$ lcov --capture --initial --directory myFullPath --output-file myOutputFile

然后运行你的程序 然后捕获覆盖数据:

$ lcov --no-checksum --directory myFullPath --capture --output-file myOutputFile

最后 lcov 使您能够生成 html 报告:

$ lcov/genhtml --highlight --legend --output-directory myOutPutHTMLdirectory myOutputFile

希望对你有所帮助。

【讨论】:

以上是关于C++ 使用 gcov 和 lcov 的问题?的主要内容,如果未能解决你的问题,请参考以下文章

使用 gcov/lcov/gcovr 在 Android APK 下获取代码覆盖率

使用 gcov/lcov/gcovr 在 Android APK 下获取代码覆盖率

从 gcov/lcov 覆盖结果中排除某些功能

GCOV/LCOV,GPROF

交叉编译环境下gcov的使用

GCOV入门