我想使用GCOV来实现代码复盖率,但是测试将在另一台机器上运行。因此,可执行文件中.gcda文件的硬连接路径将不起作用。
为了更改这个默认目录,我可以使用GCOV_PREFIX和GCOV_PREFIX_STRIP环境变量,因为它是here。
下面是我使用的命令:
$ 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路径保持不变。有人有这方面的经验吗?
发布于 2011-10-06 16:12:04
运行代码时会考虑环境变量。
在运行测试之前,在目标计算机上将它们设置为适当的值,然后在您需要的位置生成.gcda文件。
发布于 2015-02-25 23:27:55
* ARRRRGGGGGHHHHH *
请为Mat的回答投票。
在运行代码时会考虑环境变量。
这句话显然在我读过的每一篇关于如何重新定位输出的文档中都没有!
实际上,请允许我稍微扩展一下这个答案。
GCOV_PREFIX是一个运行时环境,与构建时间环境变量相反,它确定写入gcov输出文件(*.gcda)的根目录。
GCOV_PREFIX_STRIP=X也是一个运行时变量,它可以从目标文件(string XXXX.o)中找到的路径中剥离X元素
这意味着:
在生成项目时,目标文件将使用指向每个源文件位置的完整路径写入,这些源文件负责其中嵌入的每个目标文件。
因此,假设您正在如下目录结构中编写一个可执行的MyApp和一个库MyLib:
/MyProject
|-MyApp
|--MyLib请注意,MyLib是MyApp的子目录
假设MyApp有2个源文件,MyLib有3个
在使用"-coverage“标志构建之后,您将生成5个.gcno文件,每个目标文件对应1个文件。
嵌入到MyApp的源文件中的是绝对路径**/MyProject/MyApp/**a_source_file.cpp类似地,嵌入到MyLib的.o文件中的路径是the
现在,假设您和我一样,将这些文件移动到一个完全不同的计算机上,该计算机的目录结构与它们构建时的目录结构不同。在我的例子中,目标机器实际上是一个完全不同的架构。我部署到那台机器上的/some/ deploy /path,而不是/MyProject。
如果您只是运行应用程序,gcov data将尝试为项目中的每个对象文件将相应的.gcda文件写入/MyProject/MyApp和/MyProject/ MyApp /MyLib,因为这是.o文件指示的路径,毕竟,MyApp和MyLib只是归档在一起的.o文件的集合,还有一些其他魔术来修复函数、指针和其他东西。
这些目录很可能不存在,并且您可能没有以root身份运行(是吗?),因此也不会创建这些目录。所以。在部署位置/my/ deploy /path中看不到任何gcda文件。
这太让人困惑了,对吧!?!??!?!!?
这就是GCOV_PREFIX和GCOV_PREFIX_STRIP的用武之地。
(BAM!你需要告诉*运行时* .o文件中的嵌入路径并不是你真正想要的。您希望“剥离”一些路径,并将其替换为deploy目录。
因此,您可以通过GCOV_PREFIX=/some/ deploy /path设置部署目录,并且希望从生成的.gcda路径中剥离/MyProject,以便设置GCOV_PREFIX_STRIP=1
设置了这两个环境变量后,运行应用程序,然后查看/some/deploy/path/MyApp和/some/deploy/path/MyApp/MyLib和lo,这5个gcda文件奇迹般地出现了,每个对象文件一个。
注意:如果你在源代码之外构建,这个问题会变得复杂。.o指向源代码,但gcda将相对于构建目录进行编写。
https://stackoverflow.com/questions/7671612
复制相似问题