与gcov交叉分析,但忽略gcov_前缀和gcov_前缀_条

与gcov交叉分析,但忽略gcov_前缀和gcov_前缀_条,c,gcc,gcov,C,Gcc,Gcov,我想使用GCOV进行代码覆盖,但测试将在另一台机器上运行。因此,可执行文件中.gcda文件的硬连线路径将无法工作 如前所述,为了更改这个默认目录,我可以使用GCOV_前缀和GCOV_前缀_STRIP env vars 这里是我使用的命令: $ export GCOV_PREFIX="/foo/bar" $ export GCOV_PREFIX_STRIP="3" $ gcc main.c -fprofile-arcs -ftest-coverage $ strings a.out | grep

我想使用GCOV进行代码覆盖,但测试将在另一台机器上运行。因此,可执行文件中.gcda文件的硬连线路径将无法工作

如前所述,为了更改这个默认目录,我可以使用GCOV_前缀和GCOV_前缀_STRIP env vars

这里是我使用的命令:

$ export GCOV_PREFIX="/foo/bar"
$ export GCOV_PREFIX_STRIP="3"
$ gcc main.c -fprofile-arcs -ftest-coverage
$ strings a.out | grep gcda
/home/calmarius/blahblah/main.c.gcda
道路依旧。
任何人都有这方面的经验吗?

运行代码时会考虑环境变量


在运行测试之前,在目标计算机上将它们设置为适当的值,然后将在需要的位置生成
.gcda
文件。

*************arrrggggghhh************

请,请投票支持Mat的答案。
运行时会考虑环境变量 代码

我读过的关于如何重新定位输出的每个文档中显然都缺少这一句话

事实上,请允许我稍微扩展一下这个答案

GCOV_前缀是一个运行时,用于生成时间环境变量,并确定写入GCOV输出文件(*.gcda)的根目录

GCOV_PREFIX_STRIP=X也是一个运行时变量,它的作用是从对象文件(strings XXXX.o)中找到的路径中剥离X个元素

这意味着:

构建项目时,对象文件将使用每个源文件的完整路径写入,该源文件负责嵌入其中的每个对象文件

因此,假设您正在这样的目录结构中编写一个可执行MyApp和一个库MyLib:

/MyProject 
 |-MyApp 
 |--MyLib
请注意,MyLib是MyApp的一个子目录

假设MyApp有2个源文件,MyLib有3个

在使用“-coverage”标志构建之后,您将生成 5.gcno文件,每个对象文件1个

MyApp的.o文件中嵌入的将是绝对路径**/MyProject/MyApp/**a_source_file.cpp类似地,MyLib的.o文件中嵌入的将是路径**/MyProject/MyApp/MyLib/**另一个_source_file.cpp

现在,让我们假设你和我一样,将这些文件移动到一台完全不同的机器上,其目录结构与构建它们的机器完全不同。在我的例子中,目标机器实际上是一个完全不同的体系结构。我部署到该计算机上的/some/deploy/path而不是/MyProject

如果只是运行应用程序,gcov数据将尝试为项目中的每个对象文件将相应的.gcda文件写入/MyProject/MyApp和/MyProject/MyApp/MyLib,因为这是.o文件指示的路径,毕竟,MyApp和MyLib只是一起存档的.o文件的集合,用一些其他的魔法来修复函数指针之类的东西

很可能,这些目录不存在,并且您可能不是以root身份运行(是吗?),因此也不会创建这些目录。太好了。。在部署位置/my/deploy/path中不会看到任何gcda文件

这完全让人困惑,对吗

这里是GCOV_前缀和GCOV_前缀条的位置

(砰!拳头打在额头上) 您需要指示****运行时****在.o文件中嵌入的路径不是您真正想要的。您希望“剥离”部分路径,并将其替换为部署目录

因此,您可以通过GCOV_PREFIX=/some/deploy/path设置deploy目录,并希望从生成的.gcda路径中剥离/MyProject,因此将GCOV_PREFIX_strip=1

设置了这两个环境变量后,您可以运行应用程序,然后查看 /有些/deploy/path/MyApp和/some/deploy/path/MyApp/MyLib,瞧,5个gcda文件奇迹般地出现了,每个对象文件对应一个


注意:如果您进行源代码外构建,则问题会更加复杂。.o指向源代码,但gcda将相对于构建目录编写。

当然,我的问题是:如何使其工作?谢谢!更多关于该功能的信息可以从这里看到:如果GCOV_PREFIX_STRIP大于目录数量,会发生什么?删除文件名是否足够愚蠢,还是将文件名直接连接到GCOV_前缀?我在想象一个沮丧的我,只想让他们在/tmp设置strip=100000和prefix=/tmp/不知道,但运行它并找出答案并不困难。这是一种无损检测