运行多个同名源文件的GCOV出现问题

3
根据GCC在线文档,应该在与编译器调用时相同的当前目录下运行gcov。比如说,我有以下源文件布局:
-root
   -source
      -dir1
         -file.cpp
      -dir2
         -file.cpp

我在“root”目录下使用相应的标志(即-fprofile-arcs,-ftest-coverage和-lgcov)运行gcc。 然后我运行生成的程序。 默认情况下,.gcno,.gcda文件与对象文件生成在一起,看起来像:

-root
   -source
      -dir1
         -file.cpp
         -file.o
         -file.gcno
         -file.gcda
      -dir2
         -file.cpp
         -file.o
         -file.gcno
         -file.gcda

是时候运行gcov了。上述在线文档要求我在与构建程序的gcc相同的“根目录”中运行gcov。并且.gcov覆盖文件将在当前目录(也是“根目录”)生成。由于有两个文件具有相同的名称(都是“file.cpp”),因此只会生成一个file.cpp.gcov文件。另一个被覆盖了。
gcov如何解决这个问题?它是否支持具有相同名称的多个文件?
一种解决方法是使用“--p”选项(--preserve-paths)。但由于在我的情况下它会创建一个超长的文件名,所以我不想将其用作通用解决方案。
我很高兴知道是否有人可以分享一些关于为什么必须在调用gcc的相同目录中运行gcov的背景知识?或者gcov是否可以提供一个选项来定义这些源文件所在的位置,以使其更加灵活?

当然,一个解决方案是在不同的目录中不要使用相同的文件名...但也许这太明显了。 - Mats Petersson
1
太明显且太不切实际。 - Lothar
1个回答

4
自从使用-p选项(--preserve-paths)是gcov解决此问题的方法,他们还创建了-s选项(--source-prefix),以消除这些麻烦、冗长的文件名。

-s directory

--source-prefix directory

源文件名称前缀,生成输出覆盖文件时将其删除。当在单独的目录中构建并且不想在确定输出文件名时包含源目录的路径名时,此选项很有用。请注意,在确定源文件是否为绝对路径之前,将应用此前缀检测。

我按照你上述描述创建了一个测试用例,并成功消除了部分路径。在你的情况下,你可以使用以下内容:
gcov -p -s source source/dir1/file.cpp

这意味着gcov不再创建名为source#dir1#file.cpp.gcov的文件,而是在根目录下创建dir1#file.cpp.gcov。

我还测试了-s,并成功排除了较长的路径名,例如:

gcov -p -s source/someDir  source/someDir/dir1/file.cpp

因此,现在文件名source#someDir#dir1#file.cpp.gcov将被简化为dir1#file.cpp.gcov。

这样,您仍然拥有唯一的文件名,但最小化了文件名长度。

此外,这个-s选项也可以多次使用(我已经测试过),因此您也可以删除多个丑陋/长路径的文件(例如,将/usr/include/c++/4.7.2/bits/替换为一个名为char_traits.h.gcov的文件,而不是usr#include#c++#4.7.2#bits#char_traits.h.gcov)。


那绝对值得一试,谢谢你的时间;) - Eric Z

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