C++ 使用 gcov 和 lcov 遇到问题?

8

我正在使用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

1
你确定目录名拼写正确且包含了你的代码和对象吗?你尝试在该目录下运行 lcov --directory . 了吗? - Cascabel
我编辑了我的问题,你是对的:我的愚蠢“粗心大意”。但是,新的错误信息也打败了我:geninfo: 错误:/home/Projects/Game1/main.gcno:到达文件结尾时出现意外。 - cpp_noob
1
我也完全遇到了同样的错误,你最终有没有运气解决它? - PierreBdR
你只安装了一个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的符号链接)。 - aknew
3个回答

14

请务必包含 -g 标志(调试信息):-g -fprofile-arcs -ftest-coverage

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

以下是我实现零计数器的示例:

$ 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

希望这能对你有所帮助。


2

我曾经遇到过完全相同的问题。事实证明,如果在运行覆盖测试时库代码发生更改,有时会导致混淆。唯一的解决方法是删除导致错误的文件并重新编译。


这也解决了我的问题。谢谢。 - B Faley

-5

使用以下方式编译代码:

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

接下来使用以下代码生成HTML页面。

genhtml app.info

2
-1 lcov 不会编译代码,应该是 genhtml - Kleist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接